你将如何迭代一个向量
How would you iterate a vector?
这是我的代码:
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: %dn", 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 statement
并迭代集合(C#/.Net
),其中即使我在迭代过程中删除/添加元素,下一个元素始终是起始列表中的下一个。
您将如何使用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: %dn", *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: %dn", array[temp], temp);
}
相关文章:
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为什么一个向量上的多线程操作很慢
- 将一个向量插入另一个向量的某个位置
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 如何按另一个向量的方向调整一个向量?
- 将字符向量复制到另一个向量
- 制作一对共享指针并推送一个向量
- 你能把一个向量<int64>投射到一个向量<uint8>吗
- 大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24?
- 为什么我们需要在优先级队列声明中添加一个向量作为参数?
- 如何将所有指针从一个向量移动到另一个向量?
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- 使用步骤c++构建一个向量
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 将一个向量对放在一个无序映射与一个映射中