须知
欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!
点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!
list
容器简介list
是 C++ 标准模板库 (STL) 中提供的一种顺序容器。它使用 双向链表 作为底层实现,与 vector
等连续存储的容器不同,list
提供了一种非连续的存储方式,适用于插入和删除操作频繁的场景。
1.1 list
容器的特点双向链表结构:
动态大小调整:
list
不需要预先定义大小,会根据需要动态分配内存。高效的插入和删除:
低效的随机访问:
list[3]
不合法),必须通过迭代器逐个访问节点。支持双向迭代:
#include
#include
using namespace std;
int main()
{
list l1 = { 1,2,3,4,5 };
//使用范围for遍历
for (auto& s : l1)
{
cout << s << " ";
}
cout << endl;
//使用迭代器遍历
for (auto it = l1.begin(); it != l1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
功能:创建一个空的 std::list
#include
#include
int main() {
std::list myList; // 空列表
std::cout << "Size: " << myList.size() << std::endl; // 输出 0
return 0;
}
方法:可以通过花括号 {}
初始化一个列表。
#include
#include
int main() {
std::list myList = {1, 2, 3, 4, 5};
for (int num : myList) {
std::cout << num << " "; // 输出 1 2 3 4 5
}
return 0;
}
功能:创建一个指定大小的列表,元素初始化为默认值(对于基本类型是 0)
#include
#include
int main() {
std::list myList(5); // 创建包含 5 个元素的列表,初始值为 0
for (int num : myList) {
std::cout << num << " "; // 输出 0 0 0 0 0
}
return 0;
}
功能:可以同时指定列表的大小和每个元素的初始值。
#include
#include
int main() {
std::list myList(5, 42); // 创建包含 5 个元素的列表,初始值均为 42
for (int num : myList) {
std::cout << num << " "; // 输出 42 42 42 42 42
}
return 0;
}
功能:用已有的 std::list
初始化另一个列表。
#include
#include
int main() {
std::list originalList = {1, 2, 3};
std::list copiedList(originalList); // 拷贝 originalList
for (int num : copiedList) {
std::cout << num << " "; // 输出 1 2 3
}
return 0;
}
功能:从另一个容器(如数组、std::vector
等)中指定范围构造。
#include
#include
#include
int main() {
std::vector vec = {10, 20, 30, 40, 50};
std::list myList(vec.begin() + 1, vec.end() - 1); // 使用范围 [20, 30, 40]
for (int num : myList) {
std::cout << num << " "; // 输出 20 30 40
}
return 0;
}
功能:C++11 引入的移动语义,可以通过移动已有列表的内容,避免拷贝。
#include
#include
int main() {
std::list originalList = {1, 2, 3};
std::list movedList(std::move(originalList)); // originalList 内容被转移
for (int num : movedList) {
std::cout << num << " "; // 输出 1 2 3
}
return 0;
}
这些构造方法结合
std::list
的成员函数(如push_back
,emplace_back
,insert
等),可以灵活地处理双向链表数据结构。
list
迭代器的使用 获取
std::list
的迭代器
std::list
提供了三种类型的迭代器:
begin()
:指向列表的第一个元素。end()
:指向列表最后一个元素的下一个位置(即尾后迭代器)。rbegin()
和 rend()
:反向迭代器,分别指向最后一个元素和首元素的下一个位置。#include
#include
int main() {
std::list myList = {10, 20, 30, 40, 50};
// 使用 begin() 和 end() 正向迭代
for (std::list::iterator it = myList.begin(); it != myList.end(); ++it) {
std::cout << *it << " "; // 输出 10 20 30 40 50
}
std::cout << std::endl;
// 使用 rbegin() 和 rend() 反向迭代
for (std::list::reverse_iterator rit = myList.rbegin(); rit != myList.rend(); ++rit) {
std::cout << *rit << " "; // 输出 50 40 30 20 10
}
std::cout << std::endl;
return 0;
}
std::list
支持双向迭代器,可以通过正向和反向遍历元素。- 使用
std::list
的迭代器可以轻松地进行元素的访问、插入、删除和修改。std::list
提供了灵活的操作方式,适合处理需要频繁插入和删除元素的场景