簡體   English   中英

如何在 C++ 中迭代矢量時擦除或更改元素?

[英]How to erase or change element while iterating over vector in C++?

當我偶然發現一個障礙時,我正在創建一個簡單的 Erathostenes function 篩子。 為了完成這項任務的最高效率,我只想使用一個向量。 這是當前代碼:

vector<int> sieveOfErathostenes(int N) {

        vector <int> result(N, 1);

        for(int i = 2; i < sqrt(N); i++)

                if(result[i] == 1)

                        for(int j = 2*i; j < N; j += i)

                                result.at(j) = 0;
        //  :c
        return result;
}

該向量在正確的 position 中返回 1 和 0,但我無法弄清楚如何在單個循環中實現擦除或更改元素的值。 當我在迭代時使用迭代器擦除元素時,就像在擦除集合元素中一樣///我無法訪問向量來更改其值,並且當我使用標准 for 循環訪問元素時,我無法刪除它。 我嘗試從向量的末尾開始計算非零元素並在擦除時給出一些偏移但沒有成功。 TL DR:我想不通的是:

for(int i = 0; i < N; i++)
{
        if(result[i] == 0) {
                //remove at position i
        } else {
                result.at(i) = i;
        }
}

提前感謝您的時間:)

與其擦除向量中間的元素,不如從向量的開頭寫入結果,並消除向量末尾未使用的元素。

int finalSize = 0;
for(int i = 0; i < N; i++)
{
        if(result[i] != 0) {
                result[finalSize++] = i;
        }
}
result.resize(finalSize);

如果在遍歷期間仍需要從std::vector中刪除元素,請記住, erase在最后一個刪除的元素之后返回一個迭代器:

  std::vector<int> result = {1,1,1,0,1,1,1};
  for(auto it = result.begin(); it != result.end(); )
  {
    if(*it==0)
      it = result.erase(it);
    else
      it++;
  }

暫無
暫無

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

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