向量迭代器运行不正常
vector iterator not behaving properly
我想迭代地使用insert
修改vector<int>
中的第一个元素(我知道用vector最好在后面插入元素,我只是玩)。
int main() {
vector<int> v1 = {1,2,2,2,2};
auto itr = v1.begin();
print_vector(v1);
cout<<*itr<<endl; // ok, itr is pointing to first element
v1.insert(itr,3);
cout<<*itr<<endl; // after inserting 3 itr is still pointing to 1
print_vector(v1);
cout<<*itr<<endl; // but now itr is pointing to 3
v1.insert(itr,7);
print_vector(v1);
cout<<*itr<<endl;
return 0;
}
v[]: 1 2 2 2 2
1
1
v[]: 3 1 2 2 2 2
3
v[]: 131072 3 1 2 2 2 2
Process finished with exit code 0
所以我这里的问题主要是2:
- 在
v1.insert(itr,3)
之后,itr
仍然指向1
。 print_vector()
调用后 itr
指向 3
。 为什么?
- 现在
itr
它指向 3
(v1
的第一个元素)。我调用 v1.insert(itr,7)
但不是将 7 作为第一个元素,而是放置 131072
。同样,为什么?
我实现的print_vector
函数如下:
void print_vector(vector<int> v){
cout<<"v[]: ";
for(int i:v){
cout<<i<<" ";
}
cout<<endl;
}
将元素插入到 vector
后,其所有迭代器均无效,这意味着涉及它们的任何行为都属于未定义行为。您可以在 Iterator invalidation rules for C++ containers.
的答案中找到迭代器失效条件的列表
您在第一次 v1.insert()
调用后遇到的任何事情都属于未定义行为,您可以清楚地看到 131072
(任意值)的放置。
如果在每次插入调用后刷新迭代器,您应该会得到正常的行为:
int main()
{
vector<int> v1 = { 1,2,2,2,2 };
auto itr = v1.begin();
print_vector(v1);
cout << *itr << endl;
v1.insert(itr, 3);
itr = v1.begin(); // Iterator refreshed
cout << *itr << endl;
print_vector(v1);
cout << *itr << endl;
v1.insert(itr, 7);
itr = v1.begin(); // Iterator refreshed
print_vector(v1);
cout << *itr << endl;
return 0;
}
并且输出:
v[]: 1 2 2 2 2
1
3
v[]: 3 1 2 2 2 2
3
v[]: 7 3 1 2 2 2 2
7
我想迭代地使用insert
修改vector<int>
中的第一个元素(我知道用vector最好在后面插入元素,我只是玩)。
int main() {
vector<int> v1 = {1,2,2,2,2};
auto itr = v1.begin();
print_vector(v1);
cout<<*itr<<endl; // ok, itr is pointing to first element
v1.insert(itr,3);
cout<<*itr<<endl; // after inserting 3 itr is still pointing to 1
print_vector(v1);
cout<<*itr<<endl; // but now itr is pointing to 3
v1.insert(itr,7);
print_vector(v1);
cout<<*itr<<endl;
return 0;
}
v[]: 1 2 2 2 2
1
1
v[]: 3 1 2 2 2 2
3
v[]: 131072 3 1 2 2 2 2Process finished with exit code 0
所以我这里的问题主要是2:
- 在
v1.insert(itr,3)
之后,itr
仍然指向1
。print_vector()
调用后itr
指向3
。 为什么? - 现在
itr
它指向3
(v1
的第一个元素)。我调用v1.insert(itr,7)
但不是将 7 作为第一个元素,而是放置131072
。同样,为什么?
我实现的print_vector
函数如下:
void print_vector(vector<int> v){
cout<<"v[]: ";
for(int i:v){
cout<<i<<" ";
}
cout<<endl;
}
将元素插入到 vector
后,其所有迭代器均无效,这意味着涉及它们的任何行为都属于未定义行为。您可以在 Iterator invalidation rules for C++ containers.
您在第一次 v1.insert()
调用后遇到的任何事情都属于未定义行为,您可以清楚地看到 131072
(任意值)的放置。
如果在每次插入调用后刷新迭代器,您应该会得到正常的行为:
int main()
{
vector<int> v1 = { 1,2,2,2,2 };
auto itr = v1.begin();
print_vector(v1);
cout << *itr << endl;
v1.insert(itr, 3);
itr = v1.begin(); // Iterator refreshed
cout << *itr << endl;
print_vector(v1);
cout << *itr << endl;
v1.insert(itr, 7);
itr = v1.begin(); // Iterator refreshed
print_vector(v1);
cout << *itr << endl;
return 0;
}
并且输出:
v[]: 1 2 2 2 2
1
3
v[]: 3 1 2 2 2 2
3
v[]: 7 3 1 2 2 2 2
7