c++ STL系列——(三)list

在C++ STL中,list是一个双向链表容器,可以用于存储任意类型的元素。list提供了一系列的操作函数,包括元素的插入、删除、排序、查找以及对容器的遍历等。本文将详细介绍list的特点、用法以及其与其他容器的比较。

list的特点

list是一个双向链表,其内部每个节点都包含了元素的值、指向前驱节点的指针和指向后继节点的指针。这种结构使得list具有许多独特的特点:

  • 动态调整容量 :由于list是一个链式结构,因此其大小并不会像数组容器那样受到最大容量的限制,可以随时添加或移除元素。
  • 快速的元素插入和删除 :由于list是一个双向链表,因此在任何位置进行元素的插入和删除操作的时间复杂度都是O(1)。
  • 不支持随机访问 :由于list是一个链表,因此无法通过下标或指针进行随机访问,只能通过迭代器进行遍历。

list的用法

创建和初始化

创建一个空的list可以使用默认构造函数,也可以使用初始化列表:

cpp 复制代码
std::list<int> mylist; // 创建一个空的int类型的list
std::list<std::string> mystrings = {"hello", "world"}; // 使用初始化列表创建list

插入和删除元素

list提供了多种方法来插入和删除元素,例如push_back()push_front()insert()erase()等。下面是一些示例:

cpp 复制代码
std::list<int> mylist = {1, 2, 3, 4, 5};

// 在末尾添加元素
mylist.push_back(6);

// 在开头添加元素
mylist.push_front(0);

// 在指定位置插入元素
auto it = mylist.begin();
++it;
mylist.insert(it, 9);

// 删除末尾元素
mylist.pop_back();

// 删除开头元素
mylist.pop_front();

// 删除指定位置的元素
auto it2 = mylist.begin();
++it2;
mylist.erase(it2);

访问和修改元素

由于list不支持随机访问,因此必须使用迭代器进行遍历和访问元素。要修改元素的值,可以使用迭代器的解引用操作符:

cpp 复制代码
std::list<int> mylist = {1, 2, 3, 4, 5};

// 遍历list并输出元素
for (auto it = mylist.begin(); it != mylist.end(); ++it) {
    std::cout << *it << " ";
}

// 修改指定位置的元素
auto it = mylist.begin();
++it;
*it = 9;

排序和查找

list提供了内置函数来排序和查找元素,例如sort()find()count()等:

cpp 复制代码
std::list<int> mylist = {5, 3, 2, 4, 1};

// 对元素进行排序
mylist.sort();

// 查找元素并返回迭代器
auto it = std::find(mylist.begin(), mylist.end(), 3);

// 统计元素出现的次数
int count = std::count(mylist.begin(), mylist.end(), 5);

list与其他容器的比较

在C++ STL中,除了list之外还有许多其他容器,例如数组容器vector、关联容器mapset等。虽然list具有自己独特的特点,但在一些方面,它也存在一些劣势:

  • 不支持随机访问 :由于list是一个链表,因此无法通过下标或指针进行随机访问,这可能会导致一些性能问题。
  • 占用更多的内存 :由于每个节点都需要存储元素值以及指向前驱节点和后继节点的指针,因此list通常会占用比其他容器更多的内存空间。
  • 缓存不友好 :由于list的元素在内存中不是连续存储的,因此在遍历时可能会出现缓存未命中的情况,从而影响性能。

然而,list在动态调整容量、快速元素插入和删除等方面具有明显优势,这使得它在某些场景下仍然是一个非常有用的容器。

结论

总之,list是C++ STL中一个非常重要和有用的容器,可以用于存储任意类型的元素,并提供了多种操作函数,如插入、删除、排序、查找和遍历等。虽然list在一些方面具有劣势,但在一些场景下它仍然是一个非常有用的容器。如果你需要一种动态调整容量、快速插入和删除元素的容器,那么list可能是一个不错的选择。

相关推荐
RuiZN7 分钟前
Muduo---Channel类
运维·服务器·c++
誰能久伴不乏13 分钟前
深入理解 C++ 多态:对象模型与底层机制解析
开发语言·c++·架构
ShineWinsu15 分钟前
对于Linux:自定义协议(基于TCP)实现网络计算器的解析
linux·网络·c++·网络协议·tcp/ip·面试·网络计算器
Wang's Blog16 分钟前
Go-Zero项目开发30: 微服务配置中心的设计与实现
开发语言·微服务·golang·go-zero
HH‘HH20 分钟前
前端应用的离线暂停更新策略:原理、实现与最佳实践
开发语言·前端·php
郝学胜-神的一滴22 分钟前
中级OpenGL教程 026:Assimp库从编译到实战全攻略
c++·unity·游戏引擎·图形渲染·unreal engine·opengl
今夜有雨.28 分钟前
C++JSON 解析器
c++·笔记·后端·学习·json
我命由我1234530 分钟前
Android 在构建过程中,发现有两个依赖库都包含了相同路径的资源文件
android·java·开发语言·java-ee·kotlin·android-studio·android runtime
蜡台32 分钟前
JS 浏览器 / App WebView 检测工具
开发语言·javascript·ecmascript
程序喵大人1 小时前
【C++进阶】STL容器与迭代器 - 04 list 和 forward_list 用节点换稳定位置
开发语言·c++·list