C++(24):容器类<list>

目录

一、核心概念

二、基本语法

1. 声明与初始化

2.添加元素

3.访问与遍历

4. 删除元素

三、特点

1. 高效插入/删除

2. 不支持随机访问

3. 特有成员函数

4. 内存与性能

四、示例代码

五、成员函数

六、使用场景

七、注意事项        


    

         Lists将元素按顺序储存在链表中.,与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。

一、核心概念

  <list> 是C++标准库中的 双向链表 容器,其核心特性如下:

  1. 双向链表结构
    每个元素(节点)包含两个指针,分别指向前一个和后一个节点,支持双向遍历。

  2. 非连续内存分配
    元素存储在离散的内存块中,插入/删除时只需调整指针,无需移动其他元素。

  3. 双向迭代器
    支持 ++ 和 -- 操作,但不支持随机访问(如 +n 或 [])。


二、基本语法

1. 声明与初始化
  • 包含头文件:#include <list>
  • std::list<T> mylist;,其中 T 是存储在列表中的元素类型。
#include <list>
using namespace std;

// 声明一个整数链表
list<int> list1;                // 空链表
list<int> list2 = {1, 2, 3};    // 初始化列表
list<int> list3(5, 10);         // 包含5个10的链表:{10,10,10,10,10}
list<int> lst4 = {1, 2, 3, 4};   // 使用初始化列表
2.添加元素

        mylist.push_front(value):push_front()函数将val连接到链表的头部。

        mylist.push_back(value):push_back()将val连接到链表的最后。

        mylist.begin():begin()函数返回一个迭代器,指向list的第一个元素。

        insert()插入元素val到位置pos,或者插入num个元素val到pos之前,或者插入start到end之间的元素到pos的位置。返回值是一个迭代器,指向被插入的元素。

        advance 函数的作用

  • 是 <iterator> 头文件中的通用函数(需包含 <iterator>,但在 <list> 中已隐式包含)。

  • 适用于所有支持 ++ 操作的迭代器(如 list 的双向迭代器)。

  • 参数说明

    advance(迭代器, 移动步数);
    • 若步数为正数:向前移动。

    • 若步数为负数:向后移动(需迭代器支持 --

`std::allocator<void>` 是 C++ 标准库中的一个模板类,用于管理动态内存分配。它通常与容器如 `std::vector`, `std::list`, 和 `std::unordered_map` 结合使用,以在这些容器内部存储元素。然而,在给定的代码片段[^1]中,并未直接提及 `std::allocator<void>`。 `std::unordered_map` 的键和值都是自定义的,其中键(`std::vector<int>`)和值(`std::pair<std::vector<double>, std::vector<int>>`)都使用了 `std::vector`。这里的 `std::unordered_map` 的实现并没有明确使用 `std::allocator<void>`,因为它不需要一个通用的内存分配器来存储整个映射结构。 在提到的错误信息[^2]中,关于 `std::__cxx11::basic_string` 的赋值操作,实际上是在讨论字符串类型,而不是 `void` 类型。这个错误是由于运行时使用的 GCC 版本和编译时使用的 GCC 版本不匹配造成的,与 `std::allocator<void>` 没有直接关系。 如果你想了解 `std::allocator<void>` 的具体用法,你可以创建一个简单的示例: ```cpp #include <memory> #include <vector> // 创建一个空的 void 分配器实例 template <> std::allocator<void> my_allocator(); int main() { // 使用 void 分配器创建一个 vector std::vector<void*, my_allocator<void>> vec; // 注意,不能直接存储 void*,这通常是空指针,用于表示未初始化的位置 vec.push_back(nullptr); // 错误:无法对 void* 执行操作,因为它们没有类型 return 0; } // 定义 void 分配器模板实例 template <> struct std::allocator<void> : public std::allocator<char> {}; // 实现构造函数和其他必要的成员函数 ``` 尽管如此,实际场景中很少见到直接使用 `std::allocator<void>` 存储对象,因为它是用来处理不确定类型的内存分配,但通常会更倾向于明确指定要存储的对象类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易只轻松熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值