六一的部落格


关关难过关关过,前路漫漫亦灿灿。



  1. 单向链表, 无法获取前驱元素

    指定位置插入/删除元素时, 不支持emplace, insert和erase

    拥有上述操作的特殊版本, 在指定位置之后插入/删除元素: erase_after, insert_after, emplace_after

  2. 可通过before_begin操作获取首前迭代器, 因而可以实现插入/删除首元素, 获取首元素的引用

    push_front, pop_front, emplace_front, front

  3. 不支持反向迭代器, 迭代器不支持递减运算符

    不支持插入/删除尾元素: 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操作

返回新的后继; 如果无后继, 返回尾后迭代器

  1. 删除给定位置的后继元素

    p不能指向尾元素和尾后元素, 会产生未定义行为

    1lst.erase_after(p);
  2. 删除迭代器范围包含元素

    开区间(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};

标准库: forward_list


  1. 单向链表, 无法获取前驱元素

    指定位置插入/删除元素时, 不支持emplace, insert和erase

    拥有上述操作的特殊版本, 在指定位置之后插入/删除元素: erase_after, insert_after, emplace_after

  2. 可通过before_begin操作获取首前迭代器, 因而可以实现插入/删除首元素, 获取首元素的引用

    push_front, pop_front, emplace_front, front

  3. 不支持反向迭代器, 迭代器不支持递减运算符

    不支持插入/删除尾元素: 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操作

返回新的后继; 如果无后继, 返回尾后迭代器

  1. 删除给定位置的后继元素

    p不能指向尾元素和尾后元素, 会产生未定义行为

    1lst.erase_after(p);
  2. 删除迭代器范围包含元素

    开区间(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};