2016-04-05 97 views
0

這是my code你將如何迭代矢量?

std::vector<int> array; 
array.push_back(1); 
array.push_back(2); 
array.push_back(3); 
array.push_back(4); 
array.push_back(5); 

for (int i = 0; i < array.size(); i++) { 
    if(array[i]==2 || array[i]==5) { 
     array.erase(array.begin() + i); 
     printf("### REMOVED ###\n", array[i], i); 
    } 

    printf("inside val: %d | index: %d\n", array[i], i); 
} 

但你可以看到,它輸出:

inside val: 1 | index: 0 
### REMOVED ### 
inside val: 3 | index: 1 
inside val: 4 | index: 2 
### REMOVED ### 
inside val: 5 | index: 3 

,當我的 「期望」 是:

inside val: 1 | index: 0 
### REMOVED ### 
inside val: 2 | index: 1 
inside val: 3 | index: 2 
inside val: 4 | index: 3 
### REMOVED ### 
inside val: 5 | index: 4 

爲 「混亂」 索引/數組的大小,因爲它會改變目標的內存指針和大小。

我的習慣是使用foreach statementiterate a collection (C#/.Net),即使我在迭代過程中刪除/添加元素,下一個總是從開始列表開始的下一個元素。

你會怎麼做C++

+0

你的代碼你在C#中有一個例子嗎? – TAS

+0

@TAS:sure:http://rextester.com/EZMYM12731 – markzzz

+0

雖然你的問題已經足夠清晰,可以回答,但是你不會在你的C#代碼片段中執行任何刪除操作? – Quentin

回答

5

一個for循環,可以刪除元素的規範格式如下:

for(auto i = begin(coll); i != end(coll);) { 

    // ... 

    if(hasToRemove) 
     i = coll.erase(i); 
    else 
     ++i; 
} 
+1

我無法運行它:http://cpp.sh/273mz – markzzz

+0

@markzzz這是因爲'我'現在是一個迭代器。您必須對其進行解引用('* i')以訪問它引用的值,並且可以使用'i-begin(coll)'將索引檢索到該向量中。 – Quentin

+0

你能發表一個簡單的例子嗎?我無法弄清楚我想要的結果。 – markzzz

2

使用迭代器:

int ind = 0; 
for (auto i = array.begin(); i != array.end();) { 
    if(*i==2 || *i==5) { 
     i = array.erase(i); 
     printf("### REMOVED ###\n"); 
    } 
    else { 
    ++i; 
    ++ind; 
    } 

    printf("inside val: %d | index: %d\n", *i, ind); 
} 
0

只是改變這樣

for (int i = 0; i < array.size(); i++) { 
    int temp=i; 
    if(array[temp]==2 || array[temp]==5) { 
     array.erase(array.begin() + temp); 
     printf("### REMOVED ###\n", array[temp], temp); 
     i--; 
    } 

    printf("inside val: %d | index: %d\n", array[temp], temp); 
}