【C++篇】从基础到进阶:全面掌握C++ List容器的使用

文章目录

须知

欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!

点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!

 从基础到进阶:全面掌握C++ List容器的使用

一. C++ list 容器简介

list 是 C++ 标准模板库 (STL) 中提供的一种顺序容器。它使用 双向链表 作为底层实现,与 vector 等连续存储的容器不同,list 提供了一种非连续的存储方式,适用于插入和删除操作频繁的场景。

1.1 list 容器的特点

  1. 双向链表结构

    • 每个节点包含一个数据元素以及前后两个指针,分别指向前一个和后一个节点。
    • 节点的非连续存储可以避免频繁的内存移动。
  2. 动态大小调整

    • list 不需要预先定义大小,会根据需要动态分配内存。
  3. 高效的插入和删除

    • 插入和删除操作时间复杂度为 O(1),只需要调整指针,而不涉及内存的移动。
    • 适用于需要频繁在中间位置进行操作的场景。
  4. 低效的随机访问

    • 不支持随机访问(例如 list[3] 不合法),必须通过迭代器逐个访问节点。
  5. 支持双向迭代

    • 提供双向迭代器,方便从头到尾或从尾到头遍历。
#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;
}

二.  list构造函数

2.1 常见构造函数

【C++篇】从基础到进阶:全面掌握C++ List容器的使用_第1张图片

 2.1.1 默认构造函数

功能:创建一个空的 std::list

#include 
#include 

int main() {
    std::list myList; // 空列表
    std::cout << "Size: " << myList.size() << std::endl; // 输出 0
    return 0;
}
 2.1.2 使用初始化列表

方法:可以通过花括号 {} 初始化一个列表。

#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;
}
2.1.3 指定大小的构造

功能:创建一个指定大小的列表,元素初始化为默认值(对于基本类型是 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;
}
2.1.4 指定大小和初始值的构造

功能:可以同时指定列表的大小和每个元素的初始值。

#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;
}
 2.1.5 拷贝构造

功能:用已有的 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;
}
 2.1.6 区间构造

功能:从另一个容器(如数组、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;
}
 2.1.7 使用移动构造

功能: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 等),可以灵活地处理双向链表数据结构。

2.1.8 相关文档
  • C++ Reference: list constructor

三. list 迭代器的使用 

获取 std::list 的迭代器

std::list 提供了三种类型的迭代器:

  • begin():指向列表的第一个元素。
  • end():指向列表最后一个元素的下一个位置(即尾后迭代器)。
  • rbegin()rend():反向迭代器,分别指向最后一个元素和首元素的下一个位置。

 3.1 常见迭代器

【C++篇】从基础到进阶:全面掌握C++ List容器的使用_第2张图片

3.1.1  示例代码:使用正和反迭代器遍历 
#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 提供了灵活的操作方式,适合处理需要频繁插入和删除元素的场景
3.1.2 相关文档
  • C++ Reference: list iterator

四. list容量管理接口(iterfac

你可能感兴趣的:(C++,c++,开发语言,list,迭代器失效,双向链表)