# C++之STL整理(9)之list用法(创建、赋值、增删查改)详解

2024-04-21 07:52

本文主要是介绍# C++之STL整理(9)之list用法(创建、赋值、增删查改)详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++之STL整理(9)之list用法(创建、赋值、增删查改)详解

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构


C++ 的list用法整理

  • C++之STL整理(9)之list用法(创建、赋值、增删查改)详解
  • 一、 list 对象的创建
    • list 构造函数
      • 1.1 默认构造函数
      • 1.2 区间构造函数
      • 1.3 拷贝指定元素次数的构造函数
      • 1.4 拷贝构造函数
  • 二、list 数据元素的增删查改
    • 2.1 尾部插入元素
    • 2.2 删尾部元素
    • 2.3 开头插入元素
    • 2.4 删开头元素
    • 2.5 在指定位置插入元素
    • 2.6 在指定位置插入多个元素
    • 2.7 在指定位置插入区间元素
    • 2.8 清空所有元素
    • 2.9 删指定区间元素
    • 2.10 删指定位置元素
    • 2.11 删所有匹配元素
  • 三、 list 大小操作
    • 3.1 返回容器中元素的个数
    • 3.2 判断容器是否为空
    • 3.3 重新指定容器的长度为指定值(默认填充)
    • 3.4 重新指定容器的长度为指定值并指定填充值
  • 四、 list 赋值操作
    • 4.1 将区间中的数据拷贝赋值给本身
    • 4.2 将指定个数的元素拷贝赋值给本身
    • 4.3 重载等号操作符进行赋值
    • 4.4 交换两个 list 的元素
  • 五、 list 数据的存取
    • 5.1 返回第一个元素
    • 5.2 返回最后一个元素
  • 六、list 反转与排序
    • 6.1 反转链表
    • 6.2 对链表进行排序
  • 总结


提示:本文为 C++ 中 list构造、赋值、接口 的写法和举例


一、 list 对象的创建

  STL 中的std::list 是 C++ 标准模板库(STL)中的一种双向链表数据结构,可以任意位置高效插与删。它提供了许多操作来管理链表中的元素,如插、删、遍历等。以下是对 std::list 及其相关函数的详细解释,并给出每个函数的简单使用例子:

list 构造函数

1.1 默认构造函数

std::list<int> lst; // 创建一个空的 int 类型 list

1.2 区间构造函数

int arr[] = {1, 2, 3, 4, 5};  
std::list<int> lst(arr, arr + 5); // 创建一个包含数组元素的 list

1.3 拷贝指定元素次数的构造函数

std::list<int> lst(10, 5); // 创建一个包含 10 个 5 的 list

1.4 拷贝构造函数

std::list<int> lst1(10, 5);  
std::list<int> lst2(lst1); // 创建一个 lst1 的副本 lst2

二、list 数据元素的增删查改

2.1 尾部插入元素

std::list<int> lst;  
lst.push_back(1); // 在 lst 尾部插入元素 1

2.2 删尾部元素

lst.push_back(2); // lst 现在为 {1, 2}  
lst.pop_back(); // 删 lst 的最后一个元素,lst 现在为 {1}

2.3 开头插入元素

lst.push_front(0); // 在 lst 开头插入元素 0,lst 现在为 {0, 1}

2.4 删开头元素

lst.pop_front(); // 删 lst 的第一个元素,lst 现在为 {1}

2.5 在指定位置插入元素

std::list<int>::iterator it = lst.begin();  
lst.insert(it, 2); // 在 lst 的开头插入元素 2,lst 现在为 {2, 1}

2.6 在指定位置插入多个元素

lst.insert(lst.end(), 3, 3); // 在 lst 尾部插入 3 个元素 3,lst 现在为 {2, 1, 3, 3, 3}

2.7 在指定位置插入区间元素

std::list<int> lst2 = {4, 5, 6};  
lst.insert(lst.begin(), lst2.begin(), lst2.end()); // 在 lst 开头插入 lst2 的元素,lst 现在为 {4, 5, 6, 2, 1, 3, 3, 3}

2.8 清空所有元素

lst.clear(); // lst 现在是空的

2.9 删指定区间元素

lst.push_back(4); lst.push_back(5); lst.push_back(6); // lst 现在是 {4, 5, 6}  
lst.erase(lst.begin(), std::next(lst.begin(), 2)); // 删从开头到第二个元素之后的位置,lst 现在为 {6}

2.10 删指定位置元素

lst.push_back(7); // lst 现在是 {6, 7}  
lst.erase(std::prev(lst.end())); // 删最后一个元素之前的元素,lst 现在为 {7}

2.11 删所有匹配元素

lst.push_back(7); lst.push_back(7); // lst 现在是 {7, 7}  
lst.remove(7); // 删所有值为 7 的元素,lst 现在是空的

std::list 提供了丰富的操作来管理链表中的元素,这些操作都是高效的,因为 std::list 的节点存储了指向前后节点的指针,使得插入和删操作可以在常数时间内完成。在需要频繁进行插入和删操作的场景下,std::list 通常是一个很好的选择。

三、 list 大小操作

3.1 返回容器中元素的个数

std::list<int> lst = {1, 2, 3, 4, 5};  
std::size_t size = lst.size(); // size 为 5

3.2 判断容器是否为空

std::list<int> empty_lst;  
if (empty_lst.empty()) {  // 此代码块会被执行,因为 empty_lst 是空的  
}

3.3 重新指定容器的长度为指定值(默认填充)

std::list<int> lst = {1, 2, 3};  
lst.resize(5); // lst 现在为 {1, 2, 3, 默认值, 默认值}

3.4 重新指定容器的长度为指定值并指定填充值

std::list<int> lst = {1, 2, 3};  
lst.resize(5, 0); // lst 现在为 {1, 2, 3, 0, 0}

四、 list 赋值操作

4.1 将区间中的数据拷贝赋值给本身

std::list<int> lst1 = {1, 2, 3};  
std::list<int> lst2;  
lst2.assign(lst1.begin(), lst1.end()); // lst2 现在为 {1, 2, 3}

4.2 将指定个数的元素拷贝赋值给本身

std::list<int> lst;  
lst.assign(3, 4); // lst 现在为 {4, 4, 4}

4.3 重载等号操作符进行赋值

std::list<int> lst1 = {1, 2, 3};  
std::list<int> lst2;  
lst2 = lst1; // lst2 现在为 {1, 2, 3}

4.4 交换两个 list 的元素

std::list<int> lst1 = {1, 2, 3};  
std::list<int> lst2 = {4, 5, 6};  
lst1.swap(lst2); // lst1 现在为 {4, 5, 6},lst2 现在为 {1, 2, 3}

五、 list 数据的存取

5.1 返回第一个元素

std::list<int> lst = {1, 2, 3};  
int first_elem = lst.front(); // first_elem 为 1

5.2 返回最后一个元素

int last_elem = lst.back(); // last_elem 为 3

六、list 反转与排序

6.1 反转链表

std::list<int> lst = {1, 2, 3, 4, 5};  
lst.reverse(); // lst 现在为 {5, 4, 3, 2, 1}

6.2 对链表进行排序

std::list<int> lst = {5, 3, 1, 4, 2};  
lst.sort(); // lst 现在为 {1, 2, 3, 4, 5}

需要注意的是,std::list 的 sort 方法只适用于包含可比较元素的列表。对于自定义类型的元素,你需要提供比较函数或重载比较操作符,以便 sort 方法能够正确地对元素进行排序。

总结

std::list 的这些操作提供了灵活且高效的方式来管理链表结构的数据,使得在需要频繁进行插入和删除操作的场景中,std::list 成为一个非常合适的选择。

这篇关于# C++之STL整理(9)之list用法(创建、赋值、增删查改)详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922549

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义