C++学习 --list

目录

[1, 什么是list](#1, 什么是list)

[2, 创建](#2, 创建)

[2-1, 标准数据类型](#2-1, 标准数据类型)

[2-2, 自定义数据类型](#2-2, 自定义数据类型)

[2-3, 其他创建方式](#2-3, 其他创建方式)

[3, 操作list](#3, 操作list)

[3-1, 赋值](#3-1, 赋值)

[3-2, 添加元素](#3-2, 添加元素)

[3-2-1, 添加元素(assign)](#3-2-1, 添加元素(assign))

[3-2-1-1, 标准数据类型](#3-2-1-1, 标准数据类型)

[3-2-1-2, 自定义数据类型](#3-2-1-2, 自定义数据类型)

[3-2-2, 添加元素(insert)](#3-2-2, 添加元素(insert))

[3-2-2-1, 标准数据类型](#3-2-2-1, 标准数据类型)

[3-2-2-2, 自定义数据类型](#3-2-2-2, 自定义数据类型)

[3-2-3, 添加元素(push_back | push_front)](#3-2-3, 添加元素(push_back | push_front))

[3-2-3-1, 标准数据类型](#3-2-3-1, 标准数据类型)

[3-2-3-2, 自定义数据类型](#3-2-3-2, 自定义数据类型)

[3-3, 查询](#3-3, 查询)

[3-3-1, 标准数据类型](#3-3-1, 标准数据类型)

[3-3-2, 自定义数据类型](#3-3-2, 自定义数据类型)

[3-4, 获取长度(size)](#3-4, 获取长度(size))

[3-5, 设置长度(resize)](#3-5, 设置长度(resize))

[3-6, 判断是否为空(empty)](#3-6, 判断是否为空(empty))

[3-7, 删除元素](#3-7, 删除元素)

[3-7-1, 头删(pop_front)](#3-7-1, 头删(pop_front))

[3-7-2, 尾删(pop_back)](#3-7-2, 尾删(pop_back))

[3-7-3, 指定元素删除(erase)](#3-7-3, 指定元素删除(erase))

[3-8, 清空(clear)](#3-8, 清空(clear))

[3-9, 排序(sort)](#3-9, 排序(sort))

[3-10, 交换元素(swap)](#3-10, 交换元素(swap))

[3-11, 翻转](#3-11, 翻转)


1, 什么是list

C++中的一种容器类型, 也叫链表 , 数据是链式存储 的, 物理上不是 一段连续的存储空间 , 逻辑上通过链表指针来数据连接

list由节点 组成, 节点由存储数据的数据域 和存储地址的指针域组成

其迭代器不支持随机访问, 只能前移或后移

因为不是标准数据类型, 需要包含头文件才能使用**#include <list>**

2, 创建

通过list<数据类型> 对象名 , 可创建list, 数据类型可以是标准数据类型 , 也可以是自定义类型

2-1, 标准数据类型

cpp 复制代码
//list中的元素类型为string
list<string> l1;

2-2, 自定义数据类型

cpp 复制代码
Myclass m1("aaa", 1);
//list容器中的数据类型为Myclass
list<Myclass> l1;

2-3, 其他创建方式

cpp 复制代码
//通过拷贝构造创建
list<Myclass> l2(l1);
//通过迭代器区间方式创建
list<Myclass> l3(l1.begin(), l1.end());
//list容器中的元素为5个m1
list<Myclass> l4(5, m1);

3, 操作list

3-1, 赋值

通过**list<数据类型> 对象名2 = 对象名1,**进行赋值

cpp 复制代码
list<Myclass> l1;
list<Myclass> l2 = l1;

3-2, 添加元素

3-2-1, 添加元素(assign)

assign是用新的元素替换原来list的元素

3-2-1-1, 标准数据类型
cpp 复制代码
//l1中分配5个字符串对象aaa
l1.assign(5, "aaa");
//l1中用3个字符串bbb, 替换上面的5个aaa
l1.assign(3, "bbb");
3-2-1-2, 自定义数据类型
cpp 复制代码
Myclass m1("aaa", 1);
Myclass m2("bbb", 2);
list<Myclass> l1;
//l1中的元素为5个m1对象
l1.assign(5, m1);
//l1的元素被替换为5个m2对象替换
l1.assign(5, m2);

3-2-2, 添加元素(insert)

insert是向list指定位置 , 添加元素, 支持一次添加多个元素

3-2-2-1, 标准数据类型
cpp 复制代码
//在l1.begin()迭代器指向位置, 插入元素aaa
l1.insert(l1.begin(), "aaa");
//在l1.begin()迭代器指向位置, 插入3个字符串bbb
l1.insert(l1.begin(), 3, "bbb");
//在l1.begin()迭代器指向位置, 插入区间:l1.begin(), l1.end()指向的元素
l1.insert(l1.begin(), l1.begin(), l1.end());
3-2-2-2, 自定义数据类型
cpp 复制代码
Myclass m1("aaa", 1);
Myclass m2("bbb", 2);
list<Myclass> l1;
//在l1.begin()迭代器指向位置, 插入元素m1
l1.insert(l1.begin(), m1);
//在l1.begin()迭代器指向位置, 插入3个m2
l1.insert(l1.begin(), 3, m2);
//在l1.begin()迭代器指向位置, 插入区间:l1.begin(), l1.end()指向的元素
l1.insert(l1.begin(), l1.begin(), l1.end());

3-2-3, 添加元素(push_back | push_front)

push_back 是在尾部 插入元素, push_front 是在头部 插入元素, 两者都只能单个添加

3-2-3-1, 标准数据类型
cpp 复制代码
//在头部插入字符串元素bbb
l1.push_front("bbb");
//在尾部插入字符串元素aaa
l1.push_back("aaa");
3-2-3-2, 自定义数据类型
cpp 复制代码
Myclass m1("aaa", 1);
Myclass m2("bbb", 2);
list<Myclass> l1;
//在头部插入元素m1
l1.push_front(m1);
//在尾部插入元素m1
l1.push_back(m2);

3-3, 查询

由于list的数据不在连续内存空间上, 所以不支持索引访问

通过对象名.front() 获取 元素**, 对象名.back()** , 获取 元素, 通过迭代器, 获取指定元素

3-3-1, 标准数据类型

cpp 复制代码
//获取首元素
cout << l1.front() << endl;
//获取尾元素
cout << l1.back() << endl;
//通过迭代器获取元素
list<string>::iterator it = l1.begin();
it++;
it++;
cout << *it << endl;

3-3-2, 自定义数据类型

cpp 复制代码
Myclass m1("aaa", 1);
Myclass m2("bbb", 2);
list<Myclass> l1;
//在头部插入字符串元素bbb
l1.push_front(m1);
//在尾部插入字符串元素aaa
l1.push_back(m2);
//获取首元素
cout << l1.front().m_name << " " << l1.front().m_age << endl;
//获取尾元素
cout << l1.back().m_name << " " << l1.back().m_age << endl;
//通过迭代器获取
list<Myclass>::iterator it = l1.begin();
it++;
cout << it->m_name << " " << it->m_age << endl;

3-4, 获取长度(size)

通过对象名.size(), 获取list的长度

cpp 复制代码
cout << l1.size() << endl;

3-5, 设置长度(resize)

通过对象名.resize(), 设置list的长度

cpp 复制代码
//设置list的长度为5
l1.resize(5);
//设置list的长度为10, 多余为用m1填充
l1.resize(10, m1);

3-6, 判断是否为空(empty)

通过对象名.empty(), 判断list是否为空, 为空返回1, 不为空返回0;

cpp 复制代码
cout << l1.empty() << endl;

3-7, 删除元素

3-7-1, 头删(pop_front)

通过对象名.pop_front(), 删除list的头部元素

cpp 复制代码
//删除deque中的首元素
l1.pop_front();

3-7-2, 尾删(pop_back)

通过对象名.pop_back(), 删除list的尾部元素

cpp 复制代码
//删除deque中的尾元素
l1.pop_back();

3-7-3, 指定元素删除(erase)

通过对象名.erase(迭代器名称), 删除迭代器指向的元素

cpp 复制代码
//删除指定的元素
l1.erase(d.begin());
list<Myclass>::iterator it;
it++;
l1.erase(it);

3-8, 清空(clear)

通过对象名.clear(), 删除迭代器指向的元素

cpp 复制代码
//通过迭代器指定区间进行清空
l1.erase(l1.begin(), l1.end());
//清空元素
l1.clear()

3-9, 排序(sort)

cpp 复制代码
list<string> l1;
l1.push_back("ddd");
l1.push_back("aaa");
l1.push_back("ccc");
l1.push_back("bbb");
l1.sort();

3-10, 交换元素(swap)

通过对象名1.swap(对象名2) , 可交换两个list中的元素, 元素类型需要一致

cpp 复制代码
l1.swap(l2);

3-11, 翻转

通过对象名.reverse(), 可翻转list中的元素

cpp 复制代码
l1.reverse();
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习