C++ forward_list::::insert_after

本文详细介绍了C++标准库中的forward_list容器,包括插入操作、遍历方式和与其他容器的交互,旨在帮助开发者更高效地利用此特性进行程序设计。

原文
可以在后面插
别的同list::insert

// forward_list::insert_after
#include <iostream>
#include <array>
#include <forward_list>
using namespace std;
int main ()
{
  array<int,3> myarray = { 11, 22, 33 };
  forward_list<int> mylist;
  forward_list<int>::iterator it;
  it = mylist.insert_after ( mylist.before_begin(), 10 );          // 10
                                                                   //  ^  <- it
  it = mylist.insert_after ( it, 2, 20 );                          // 10 20 20
                                                                   //        ^
  it = mylist.insert_after ( it, myarray.begin(), myarray.end() ); // 10 20 20 11 22 33
                                                                   //                 ^
  it = mylist.begin();                                             //  ^
  it = mylist.insert_after ( it, {1,2,3} );                        // 10 1 2 3 20 20 11 22 33
                                                                   //        ^

  std::cout << "mylist contains:";
  for (int& x: mylist) std::cout << ' ' << x;
  std::cout << '\n';
  return 0;
}
### C++ std::forward_list 使用指南和常见问题 #### 1. 简介 `std::forward_list` 是 C++ 标准模板库(STL)中的一种单向链表容器,它只支持从头部插入元素,并且不提供随机访问功能。与 `std::list` 不同,`std::forward_list` 只维护一个指向下一个节点的指针,因此它的内存开销较小[^2]。 #### 2. 基本特性 - **单向链表**:`std::forward_list` 的每个节点仅包含一个指向下一个节点的指针,这使得它在某些场景下比 `std::list` 更节省内存。 - **无尾指针**:`std::forward_list` 不维护尾指针,因此无法在常数时间内访问最后一个元素。 - **高效头部插入**:在头部插入元素的操作非常高效,时间复杂度为 O(1)。 #### 3. 构造函数 `std::forward_list` 提供了多种构造方式,包括默认构造、指定大小构造、使用初始化列表构造以及通过迭代器范围构造等[^4]。 ```cpp #include <iostream> #include <forward_list> int main() { // 创建一个空的 forward_list std::forward_list<int> fl1; // 使用初始化列表构造 forward_list std::forward_list<int> fl2{1, 2, 3, 4, 5}; // 通过迭代器范围构造 forward_list std::forward_list<int> fl3(fl2.begin(), fl2.end()); return 0; } ``` #### 4. 操作函数 `std::forward_list` 提供了一系列操作函数来管理其元素,包括插入、删除、遍历等。 - **插入操作**: - `push_front`:在头部插入一个元素。 - `emplace_front`:在头部构造一个元素。 - `insert_after`:在指定位置之后插入一个或多个元素。 - **删除操作**: - `pop_front`:删除头部元素。 - `erase_after`:删除指定位置之后的一个或多个元素。 - **其他操作**: - `before_begin`:返回一个特殊的迭代器,用于表示第一个元素之前的虚拟位置。 - `empty`:检查列表是否为空。 - `merge`:将两个已排序的 `std::forward_list` 合并为一个。 ```cpp #include <iostream> #include <forward_list> int main() { std::forward_list<int> fl = {3, 1, 4, 1, 5}; // 在头部插入元素 fl.push_front(9); // 删除头部元素 fl.pop_front(); // 插入元素到指定位置之后 auto it = fl.begin(); ++it; // 移动到第二个元素之后 fl.insert_after(it, 2); // 遍历并输出元素 for (const auto& elem : fl) { std::cout << elem << " "; } std::cout << std::endl; return 0; } ``` #### 5. 常见问题 ##### Q: 如何遍历 `std::forward_list`? A: 由于 `std::forward_list` 不支持随机访问,只能通过迭代器从前向后遍历[^4]。 ```cpp for (auto it = fl.begin(); it != fl.end(); ++it) { std::cout << *it << " "; } ``` ##### Q: `std::forward_list` 是否支持尾部插入? A: 不支持直接的尾部插入操作。如果需要在尾部插入元素,可以通过 `insert_after` 和 `before_begin` 结合使用来实现。 ```cpp fl.insert_after(std::prev(fl.end()), 6); ``` ##### Q: `std::forward_list` 和 `std::list` 的主要区别是什么? A: `std::forward_list` 是单向链表,而 `std::list` 是双向链表。`std::forward_list` 不维护尾指针,因此更节省内存,但无法在常数时间内访问最后一个元素[^1]。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值