C++学习之list容器

简介: C++学习之list容器

C++ list基本概念

在C++中,std::list是一个双向链表(doubly linked list)容器,它包含在 <list> 头文件中。下面是一些关于C++ std::list的基本概念:

  1. 双向链表结构std::list是由多个节点组成的双向链表结构,每个节点包含数据元素和指向前一个节点和后一个节点的指针。
  2. 动态内存std::list中的节点是动态分配的,可以根据需要动态增加或减少节点数量,因此不需要提前指定大小。
  3. 无需移动元素:由于是双向链表,插入或删除元素时不需要移动其他元素,只需要修改相邻节点之间的指针。
  4. 迭代器支持std::list提供了迭代器(iterator)来遍历容器中的元素,包括正向迭代器、逆向迭代器等。
  5. 常见操作std::list提供了许多方法用于插入、删除、查找元素,例如 push_back()push_front()insert()erase()remove() 等。
  6. 不支持随机访问:与数组不同,std::list不支持通过下标来访问元素,只能通过迭代器按顺序访问元素。
  7. 效率:在单次插入/删除操作时,std::list的效率比较高,但在需要频繁随机访问元素时,效率可能不如std::vector等线性容器。

std::list`是一个非常灵活的容器,特别适合需要频繁进行插入和删除操作的场景。

C++ list赋值和交换

在C++中,std::list提供了多种方式进行赋值和交换操作。下面分别介绍 std::list 的赋值和交换:

赋值操作

  1. 使用 operator= 进行赋值
std::list<int> list1 = {1, 2, 3};
std::list<int> list2;
list2 = list1; // 使用 operator= 进行赋值
// 现在 list2 中包含和 list1 相同的元素 {1, 2, 3}
  1. 使用 assign() 方法进行赋值
std::list<int> list1 = {1, 2, 3};
std::list<int> list2;
list2.assign(list1.begin(), list1.end()); // 使用 assign() 方法进行赋值
// 现在 list2 中包含和 list1 相同的元素 {1, 2, 3}

交换操作

  1. 使用 swap() 进行交换
std::list<int> list1 = {1, 2, 3};
std::list<int> list2 = {4, 5, 6};
list1.swap(list2); // 使用 swap() 进行交换
// 现在 list1 中包含元素 {4, 5, 6},list2 中包含元素 {1, 2, 3}
  1. 使用非成员函数 std::swap() 进行交换
std::list<int> list1 = {1, 2, 3};
std::list<int> list2 = {4, 5, 6};
// 使用 std::swap() 进行交换
std::swap(list1, list2);
// 现在 list1 中包含元素 {4, 5, 6},list2 中包含元素 {1, 2, 3}

以上是一些关于C++ std::list进行赋值和交换操作的基本示例。利用这些方法,你可以方便地管理和处理 std::list 容器中的元素。

C++ list大小操作

在C++中,std::list提供了几种方法来获取列表的大小信息。以下是一些常用的 std::list 大小操作:

获取列表大小

  1. size() 方法
std::list<int> myList = {1, 2, 3, 4, 5};
std::cout << "List size: " << myList.size() << std::endl;
// 输出:List size: 5
  1. empty() 方法:检查列表是否为空
std::list<int> emptyList;
if(emptyList.empty()) {
    std::cout << "List is empty" << std::endl;
} else {
    std::cout << "List is not empty" << std::endl;
}
// 输出:List is empty

清空列表

  1. clear() 方法:清空列表中的所有元素
std::list<int> myList = {1, 2, 3, 4, 5};
myList.clear();
std::cout << "List size after clearing: " << myList.size() << std::endl;
// 输出:List size after clearing: 0

重新分配大小

  1. resize() 方法:重新分配列表的大小
std::list<int> myList = {1, 2, 3};
myList.resize(5);
std::cout << "List size after resizing: " << myList.size() << std::endl;
// 输出:List size after resizing: 5

C++ list插入和删除

在C++中,std::list提供了多种方法来插入和删除元素。以下是一些常用的 std::list 插入和删除操作:

插入操作

  1. insert() 方法:在指定位置插入一个或多个元素
std::list<int> myList = {1, 2, 3};
auto it = myList.begin();
++it; // 移动到第二个位置
myList.insert(it, 4); // 在第二个位置插入元素 4
// 现在 myList 包含元素 {1, 4, 2, 3}
  1. push_back()push_front() 方法:在末尾或头部插入一个元素
std::list<int> myList = {1, 2, 3};
myList.push_back(4); // 在末尾插入元素 4
myList.push_front(0); // 在头部插入元素 0
// 现在 myList 包含元素 {0, 1, 2, 3, 4}

删除操作

  1. erase() 方法:删除指定位置的元素
std::list<int> myList = {1, 2, 3, 4, 5};
auto it = myList.begin();
++it; // 移动到第二个位置
myList.erase(it); // 删除第二个位置的元素
// 现在 myList 包含元素 {1, 3, 4, 5}
  1. pop_back()pop_front() 方法:删除末尾或头部的元素
std::list<int> myList = {1, 2, 3};
myList.pop_back(); // 删除末尾的元素
myList.pop_front(); // 删除头部的元素
// 现在 myList 包含元素 {2}
  1. remove() 方法:删除所有匹配给定值的元素
std::list<int> myList = {1, 2, 2, 3, 2};
myList.remove(2); // 删除所有值为 2 的元素
// 现在 myList 包含元素 {1, 3}

以上是一些关于C++ std::list进行插入和删除操作的基本示例。利用这些方法,你可以方便地向列表中添加或移除元素。如果有任何问题,请随时追问!

C++ list数据存取

在C++中,可以使用迭代器或者类似数组下标的方式来进行std::list数据的存取操作。以下是一些常用的方法:

数据存取操作

  1. 使用迭代器访问列表元素
std::list<int> myList = {1, 2, 3, 4, 5};
// 使用迭代器遍历并访问元素
for (auto it = myList.begin(); it != myList.end(); ++it) {
    std::cout << *it << " ";
}
// 输出:1 2 3 4 5
  1. 使用类似数组下标的方式访问元素(需要自己实现)
template <typename T>
const T& list_at(const std::list<T>& myList, size_t index) {
    auto it = myList.begin();
    std::advance(it, index);
    return *it;
}
std::list<int> myList = {1, 2, 3, 4, 5};
// 访问第三个元素
int element = list_at(myList, 2);
std::cout << "Element at index 2: " << element << std::endl;
// 输出:Element at index 2: 3

更新元素的值

  1. 使用迭代器更新元素的值
std::list<int> myList = {1, 2, 3, 4, 5};
// 使用迭代器更新元素的值
auto it = myList.begin();
std::advance(it, 2); // 移动到第三个位置
*it = 10; // 更新第三个位置的元素为 10
// 现在 myList 包含元素 {1, 2, 10, 4, 5}

std::list 不支持直接通过下标方式访问元素,但可以通过迭代器来访问和修改元素。同时也可以根据实际需求自行实现类似数组下标的访问方法,这样就能更灵活地访问和更新 std::list 中的元素。如有任何疑问,请随时提出!

C++ list翻转和排序

在C++中,可以使用std::list容器的成员函数reverse()来实现列表的翻转操作。同时,可以结合使用sort()函数对列表进行排序。以下是示例代码:

翻转列表

#include <iostream>
#include <list>
int main() {
    std::list<int> myList = {1, 2, 3, 4, 5};
    // 翻转列表
    myList.reverse();
    // 打印翻转后的列表
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:5 4 3 2 1
    return 0;

对列表排序(升序)

#include <iostream>
#include <list>
#include <algorithm>
int main() {
    std::list<int> myList = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    // 排序列表(升序)
    myList.sort();
    // 打印排序后的列表
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:1 1 2 3 3 4 5 5 6 9
    return 0;
}

在上面的示例中,reverse()函数用于翻转列表,而sort()函数则用于对列表进行排序(默认升序)。你可以根据需要调用这些函数来实现对std::list容器的翻转和排序操作。如有任何疑问,请随时提出!

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

相关文章
|
5月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
694 6
|
5月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
253 4
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
算法 C++ 容器
模拟实现c++中的list模版
模拟实现c++中的list模版
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
323 2
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
449 7
|
存储 编译器 C++
C++ initializer_list&&类型推导
在 C++ 中,`initializer_list` 提供了一种方便的方式来初始化容器和传递参数,而右值引用则是实现高效资源管理和移动语义的关键特性。尽管在实际应用中 `initializer_list&&` 并不常见,但理解其类型推导和使用方式有助于深入掌握现代 C++ 的高级特性。
219 4
|
存储 算法 C++
【C++打怪之路Lv10】-- list
【C++打怪之路Lv10】-- list
209 1
|
Kubernetes Linux 持续交付
docker容器学习
【10月更文挑战第1天】
249 1
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
222 0