簡體   English   中英

矢量擦除功能無法正常工作

[英]Vector erase function not working properly

我正在嘗試hackerrank上的練習題之一。
我知道有更好的方法來做到這一點,但我想知道為什么這種方法不能更好地理解它。
矢量擦除功能似乎按預期工作,直到最后幾次,然后在錯誤的索引處擦除,即使沒有任何變化。

調試器輸出:
1, 1, 3, 1, 2, 1, 3, 3, 3, 3, //當前在向量中的是什么
Delete indx 0 & 1 //我將擦除的第一對並遞增計數

3, 1, 2, 1, 3, 3, 3, 3, //繼續...
刪除索引 0 & 4

1, 2, 1, 3, 3, 3,
刪除索引 0 & 2

2, 3, 3, 3,
Delete indx 1 & 2 //表示刪除前三個和后三個

3, 3, //看起來第0個和其他一些索引被刪除了
刪除索引 0 & 1

返回的計數為:5
如果我可以添加到這個問題以使其更好,請告訴我,謝謝

int i, count = 0;

for (i=0;i<ar.size()-1;i++)
{
    for (int j=i+1;j<ar.size();j++)
    {
        if (ar[i] == ar[j])
        {
            ar.erase(ar.begin()+i-1);
            ar.erase(ar.begin()+j-1);
            count++;
            i=-1;
            break;
        }
    }
    if (ar.size()== 0)
        break;
}

據我了解,您只需要對的數量(考慮到刪除)。

for(int i = 0; i < ar.size() - 1; i++){
    for(int j = i + 1; j < ar.size(); j++){
        if(ar[i] == ar[j]) {
            ar.erase( ar.begin() + j );
            count++; 
            break;
        }
    }
}

這樣您只需要執行 1 次擦除調用(這很慢,考慮到它將已刪除元素 1 插槽右側的所有元素向左移動)。

如果你有大向量,也不要一直使用ar.size() (至少在j循環中,因為在i循環中它是必不可少的)。 嘗試for(int j = i + 1, len = ar.size(); j < len; j++)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM