我想迭代使用insert來修改 a 中的第一個元素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行程以退出代碼 0 結束
所以我的問題主要是2:
- 之后
v1.insert(itr,3),itr依舊是指著1。在呼叫print_vector()now 后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;
}
uj5u.com熱心網友回復:
將元素插入到 a 后vector,其所有迭代器都將失效,這意味著涉及它們的任何行為都屬于未定義行為。您可以在有關 C 容器的迭代器失效規則的答案中找到迭代器失效條件的串列。
您在第一次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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349711.html
上一篇:修改指標值
下一篇:C :為什么這不會導致懸空指標?
