标准库: forward_list
2023年12月23日 2023年12月25日
-
单向链表, 无法获取前驱元素
指定位置插入/删除元素时, 不支持emplace, insert和erase拥有上述操作的特殊版本, 在指定位置之后插入/删除元素: erase_after, insert_after, emplace_after
-
可通过before_begin操作获取首前迭代器, 因而可以实现插入/删除首元素, 获取首元素的引用
push_front, pop_front, emplace_front, front -
不支持反向迭代器, 迭代器不支持递减运算符
不支持插入/删除尾元素: push_back, emplace_back, pop_back不支持获取尾元素的引用: back
获取首前迭代器
1lst.before_begin(); 2 3lst.cbefore_begin();
emplace_after操作
使用参数构造元素, 在给定迭代器的下一位置插入
1lst.emplace_after(p, args);
insert_after操作
在给定迭代器的下一位置插入元素
p不能是尾后迭代器, 会产生未定义行为
修改给定迭代器的后继, 原后继元素后移, 返回指向最后一个插入元素的迭代器
如果没有插入元素, n为0/迭代器范围为空/列表为空, 返回p
1lst.insert_after(p, t); 2 3lst.insert_after(p, n, t); 4 5lst.insert_after(p, b, e); 6 7lst.insert_after(p, il);
erase_after操作
返回新的后继; 如果无后继, 返回尾后迭代器
-
删除给定位置的后继元素
p不能指向尾元素和尾后元素, 会产生未定义行为
1lst.erase_after(p);
-
删除迭代器范围包含元素
开区间(b, e)如果区间内不含元素, 返回尾后迭代器
1lst.erase_after(b, e);
删除给定位置的后继元素
实际编写代码时, 还是会存储元素的前驱, 用以删除当前元素
1forward_list<int> flst = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 2auto prev = flst.before_begin(); 3auto curr = flst.begin(); 4 5while (curr != flst.end()) 6{ 7 if (*curr % 2) 8 curr = flst.erase_after(prev); // 返回2,4,6,8,尾后迭代器 9 else 10 { 11 prev = curr; 12 ++curr; 13 } 14} 15 16// flst = {0, 2, 4, 6, 8};
删除迭代器范围包含元素
指向本容器元素
1forward_list<int> flst = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9}; 2auto start = flst.before_begin(); 3auto end = flst.begin(); 4 5int c = 5; 6do { 7 ++end; 8} while(--c > 0); 9 10// *end = 1 11 12auto it = flst.erase_after(start, end); 13 14// *it = 1; 15// flst = {1, 3, 5, 7, 9};