【发布时间】:2015-03-29 19:32:09
【问题描述】:
我想处理
vector<int>容器中的每个节点。假设
vector<int>包含 0、1、2 和 3,并且一个迭代器指向 2。我想擦除 2 而不会丢失迭代器的位置信息,因为我想在擦除 2 之后处理“3”。
这是我所做的,但输出未显示我的意图。
这是我的问题:
Q1) 当vector<int>::iterator oldIter = iter;被执行时,
oldIter 是否创建新的迭代器对象?
Q2) 为什么迭代器自增后的值不变?
Q3) 什么是擦除节点而不丢失的好方法 迭代器的位置?
Q4) 最后,一个微不足道的问题。我试过cout << iter;,但它不起作用。这是为什么呢?
代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vContainer;
vector<int>::iterator iter;
vContainer.push_back(0);
vContainer.push_back(1);
vContainer.push_back(2);
vContainer.push_back(3);
for(int i = 0; i < vContainer.size(); i++){
cout << vContainer[i] << endl;
}
printf("iter: %x\n", iter);
iter = vContainer.begin();
// Move the itertor to the 2.
while(*iter != 2){
iter++;
}
printf("iter: %x\n", iter);
vector<int>::iterator oldIter = iter;
printf("\nBefore erase(oldIter)\n");
printf("oldIter: %x\n", oldIter);
printf("iter: %x\n", iter);
iter++;
printf("\nAfter incrementing iter\n");
printf("oldIter: %x\n", oldIter);
printf("iter: %x\n", iter);
vContainer.erase(oldIter);
printf("\nAfter erase(oldIter)\n");
printf("oldIter: %x\n", oldIter);
printf("iter: %x\n", iter);
for(int i = 0; i < vContainer.size(); i++){
cout << vContainer[i] << endl;
}
}
【问题讨论】: