你会如何迭代一个向量?
How would you iterate a vector?
这是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
当我的 "expectation" 是:
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
它 "messes" 在操作自身时具有 index/array 的大小,因为这会改变目标的内存指针和大小。
我的习惯是使用 foreach statement
和 iterate a collection (C#/.Net
),即使我在迭代期间 remove/add 元素,下一个总是从开始列表开始的下一个。
你会如何使用 C++
?
可以删除元素的 for
循环的规范形式如下:
for(auto i = begin(coll); i != end(coll);) {
// ...
if(hasToRemove)
i = coll.erase(i);
else
++i;
}
使用迭代器:
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);
}
只需像这样更改您的代码
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);
}
这是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
当我的 "expectation" 是:
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
它 "messes" 在操作自身时具有 index/array 的大小,因为这会改变目标的内存指针和大小。
我的习惯是使用 foreach statement
和 iterate a collection (C#/.Net
),即使我在迭代期间 remove/add 元素,下一个总是从开始列表开始的下一个。
你会如何使用 C++
?
可以删除元素的 for
循环的规范形式如下:
for(auto i = begin(coll); i != end(coll);) {
// ...
if(hasToRemove)
i = coll.erase(i);
else
++i;
}
使用迭代器:
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);
}
只需像这样更改您的代码
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);
}