c/c++ 標準容器 forward_list, resize, 重新定位迭代器
1,forward_list特有的方法:
- insert_after
- emplace_after
- erase_after
2,容器的插入刪除操作後的注意事項
- 必須保證每次改變容器的操作後都正確地重新定位迭代器。
- 如果在迴圈中插入/刪除deque,vector,string中的元素,不要快取end返回的迭代器。
知識點
1,forward_list容器的使用,對應程式碼裡的test1
2,resize的使用,對應程式碼裡的test2
3,容器的插入刪除操作後的注意事項,對應程式碼裡的test3
#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <forward_list>
#include <deque>
using namespace std;
int main(){
//test1 forward_list容器的使用
//insert_after,emplace_after,erase_after
/*
forward_list<int> fl{0,1,2,3,4,5};
//返回頭迭代器
auto head = fl.before_begin();
//在head的後面插入6,並返回指向6的迭代器,第一個元素是6
auto it = fl.insert_after(head, 6);
cout << *it << endl;
for(auto s : fl){
cout << s << " ";
}
cout << endl;
auto it1 = fl.erase_after(it);
cout << *it1 << endl;
for(auto s : fl){
cout << s << " ";
}
cout << endl;
fl.pop_front();
for(auto s : fl){
cout << s << " ";
}
cout << endl;
*/
//test2 resize
//如果當前容器的大小大於所要求的大小,容器後部的元素會被刪除;
//如果當前容器的大小小於所要去的大小,會講新元素新增到容器的後部
/*
list<int> li(5,11);
cout << li.size() << endl;
for(auto s : li){
cout << s << " ";
}
cout << endl;
li.resize(7,2);
cout << li.size() << endl;
for(auto s : li){
cout << s << " ";
}
cout << endl;
li.resize(3,8);//因為3小於原來容器的大小7,所以第二個引數8就被忽略了
cout << li.size() << endl;
for(auto s : li){
cout << s << " ";
}
cout << endl;
*/
//test3 容器的插入刪除操作可能使迭代器失效
vector<int> vi = {0,1,2,3,4,5,6,7,8,9};
auto it = vi.begin();
//這裡每次都會重新去取得尾迭代器,不會有問題,
//如果提前把end儲存了的話,改變vi後,end就失效了,會死迴圈等
while(it != vi.end()){
//奇數的時候
if(*it % 2){
it = vi.insert(it, *it);
//重新設定迭代器,讓it指向下一個奇數
it += 2;
}
//偶數的時候
else{
it = vi.erase(it);
}
}
for(auto s : vi){
cout << s << " ";
}
cout << endl;
}