我想处理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;}} 最佳答案 执行vector<int>::iterator oldIter = iter;时,是否执行oldIter  创建一个新的迭代器对象?是。  为什么递增后迭代器的值保持不变  它?没有。是什么使您得出结论呢?您的printf语句?这些无效。 printf不知道如何处理向量迭代器。您对它的调用是未定义的行为。  在不丢失节点位置的情况下擦除节点的好方法是什么  迭代器?捕获erase调用的返回值。iter = vContainer.erase(iter);  最后是一个琐碎的问题。我尝试了cout   工作。这是为什么?因为没有operator<<重载,所以在左边没有std::ostream,而在右边有向量迭代器。与printf不同,std::ostream::operator<<是类型安全的,因此您将获得编译时错误,而不是运行时未定义的行为。关于c++ - STL如何在delete()之后保存迭代器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29333802/
10-11 23:10