在使用迭代器进行添加删除容器元素时,需要注意当操作完成后,原有的迭代器可能会失效!!所以必须在循环中更新迭代器。且不要在循环之前保存end尾后迭代器,这样可能会引起一些未定义行为。
问题:使用forward_list单向链表存储int数据,使用迭代器遍历链表,将奇数复制,偶数删除。
使用list双向链表存储int数据,使用迭代器遍历链表,将奇数复制,偶数删除。
成员函数:.before_begin 返回一个首前迭代器
.insert_after(p, t)在迭代器指向位置后添加t元素,并返回指向新添加元素t的迭代器
.erase_afer(p) 删除p迭代器指向位置的元素,并返回指向被删除元素之后的迭代器
.insert(p, t)在迭代器p之前添加t元素,返回指向添加元素的迭代器
.erase(p)删除迭代器p所指向的元素,返回被删除元素之后的迭代器
forward_list版本
#include <iostream>
#include <forward_list>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
forward_list<int> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
auto pre_it = arr.before_begin(); // 首前迭代器
auto iter = arr.begin(); // 指向当前元素的迭代器
while (iter != arr.end()){
if (*iter % 2){
iter = arr.insert_after(iter, *iter);
pre_it = iter;
++iter;
} else{
auto temp = arr.erase_after(pre_it);
pre_it = iter;
iter = temp;
}
}
for (const auto &i : arr)
cout << i << " ";
return 0;
}
list版本
#include <iostream>
#include <list>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
list<int> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto iter = arr.begin(); iter != arr.end();){
if (*iter % 2){
iter = arr.insert(iter, *iter); // 返回指向添加元素的迭代器
++iter;
++iter;
} else{
iter = arr.erase(iter); // 指向被删除元素之后
}
}
for (const auto &i : arr)
cout << i << " ";
return 0;
}