文章目录
-
- 测试环境
- list介绍
- 头文件
- 模块类定义
- 对象构造
- 初始化
- 元素访问
- 元素插入和删除
- 容器大小
- 迭代器
- 其他函数
测试环境
系统:ubuntu 22.04.2 LTS 64位
gcc版本:11.3.0
编辑器:vsCode 1.76.2
list介绍
- 支持常数时间在容器的任何位置插入和删除元素。
- 不支持随机访问,仅支持自增(++)和自减(–)操作。
- 元素存储在不同且不相关的存储单元中。
- 频繁插入、提取、移动和删除元素时效率较高。
- 双向列表
头文件
#include
模块类定义
_Tp:表示存储的元素数据类型
_Alloc:表示所存储分配器的类型,负责元素内存的分配和释放。可选参数,一般不使用。
template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class list{};
对象构造
std::list<int> lstInt1;
std::list<int> lstInt2(10);
std::list<int> lstInt3(10,6);
std::list<int> lstInt4(lstInt3);
std::list<int> lstInt5(lstInt3.begin(),lstInt3.end());
std::list<int> lstInt6(std::move(lstInt5));
std::list<int> lstInt7({1,2,3,4,5,6,7,8,9,0});
初始化
lstInt1 = {1,2,3,4,5};
lstInt1.assign(lstInt6.cbegin(), lstInt6.cend());
lstInt1.assign(5,8);
lstInt1.assign({8,7,6,5,4,3,2,1});
元素访问
函数名 |
返回值 |
功能 |
front() |
首元素的引用 |
获取首元素,链表为空时返回值不确定 |
back() |
元素的引用 |
获取末尾元素,链表为空时返回值不确定 |
std::cout << lstInt1.front() << " " << lstInt1.back() << std::endl;
元素插入和删除
函数 |
返回值 |
功能 |
clear() |
无 |
清空所有元素 |
erase() |
迭代器 |
清除指定位置的一个元素或通过迭代器指定范围内的元素 |
emplace() |
无 |
在指定位置插入元素 |
emplace_front() |
无 |
在链表头插入元素 |
emplace_back() |
无 |
在链表末尾拆插入元素 |
insert() |
迭代器或无 |
1)在指定位置插入1个元素。2)在指定位置插入指定数量的相同元素。3)通过指定迭代器范围在指定位置插入数据 |
pop_front() |
无 |
删除链表头元素 |
push_front() |
无 |
链表头插入元素 |
pop_back() |
无 |
删除链表末尾元素 |
push_back() |
无 |
在链表末尾添加元素 |
remove() |
无 |
删除与指定值相同的所有元素 |
remove_if() |
无 |
按用户自定义条件删除元素 |
lstInt1.push_front(88);
lstInt1.push_back(66);
lstInt1.emplace(++lstInt1.begin(), 20);
lstInt1.emplace_front(10);
lstInt1.emplace_back(10);
lstInt1.insert(lstInt1.begin(),66);
lstInt1.insert(lstInt1.begin(),3,8);
lstInt1.insert(lstInt1.begin(), lstInt1.begin(), lstInt1.end());
lstInt1.insert(lstInt1.begin(), {1,2,3});
lstInt1.pop_front();
lstInt1.pop_back();
lstInt1.erase(lstInt1.begin());
lstInt1.erase(lstInt1.begin(), ++lstInt1.begin());
lstInt1.remove(8);
class delThanTen
{
public:
bool operator()(int &element)
{
return element > 10;
}
};
lstInt1.remove_if(delThanTen());
lstInt1.clear();
容器大小
函数 |
返回值 |
功能 |
empty() |
bool |
判断当前容器是否为空,为空返回true,否则返回false |
size() |
std::size_t |
获取当前容器中的元素数量 |
max_size() |
std::size_t |
返回容器的最大容量 |
reverse() |
无 |
反转链表中的元素排列顺序 |
resize() |
无 |
重新指定容器可以容纳的元素数量,新大小大于原本大小时超出部分可使用指定元素填充,如果新大小小于指定大小时会删除容器原本末尾的数据。 |
std::cout << std::boolalpha << lstInt1.empty() << std::endl;
lstInt1.resize(30);
std::cout << lstInt1.max_size() << std::endl;
std::cout << lstInt1.size() << std::endl;
lstInt1.reverse();
迭代器
类型 |
功能 |
iterator |
正向访问迭代器。从前向后访问元素,可以读取也可以修改 |
const_iterator |
常量正向访问迭代器。从前向后访问元素,只能读取不能修改 |
reverse_iterator |
逆向访问迭代器。从后向前访问元素,可以读取也可以修改 |
const_reverse_iterator |
常量逆向访问迭代器。从后向前访问元素,只能读取不能修改 |
函数 |
返回值 |
功能 |
begin() |
正向访问迭代器 |
返回指向list对象首元素所在位置的迭代器 |
end() |
正向访问迭代器 |
返回指向list对象末尾元素的下一个位置的迭代器 |
cbegin() |
常量正向访问迭代器 |
返回指向list对象首元素所在位置的常量迭代器 |
cend() |
常量正向访问迭代器 |
返回指向list对象末尾元素的下一个位置的迭代器 |
rbegin() |
逆向访问迭代器 |
返回指向list对象末尾元素位置的迭代器 |
rend() |
逆向访问迭代器 |
返回指向list对象首元素的前一个位置的迭代器 |
crbegin() |
常量逆向访问迭代器 |
返回指向list对象末尾元素位置的常量迭代器 |
crend() |
常量逆向访问迭代器 |
返回指向list对象首元素的前一个位置的常量迭代器 |
std::list<int> lstTest4 = {10,11,12,13,14,15,16,17,18,19};
std::list<int>::iterator itr;
for (itr = lstTest4.begin(); itr != lstTest4.end(); itr++)
{
*itr += 10;
std::cout << *itr << " ";
}
std::cout<<std::endl;
std::list<int>::const_iterator cItr;
for (cItr = lstTest4.begin(); cItr != lstTest4.end(); cItr++)
{
std::cout << *cItr << " ";
}
std::cout<<std::endl;
std::list<int>::reverse_iterator rItr;
for (rItr= lstTest4.rbegin(); rItr!= lstTest4.rend(); rItr++)
{
*rItr += 100;
std::cout << *rItr << " ";
}
std::cout<<std::endl;
std::list<int>::const_reverse_iterator crItr;
for (crItr= lstTest4.crbegin(); crItr!= lstTest4.crend(); crItr++)
{
std::cout << *crItr << " ";
}
std::cout<<std::endl;
其他函数
函数名 |
返回值 |
功能 |
merge() |
无 |
合并两个链表,并按指定规则排序 |
sort() |
无 |
按升序或用户指定的顺序排列元素 |
swap() |
无 |
交换两个容器的元素 |
splice() |
无 |
将一个链表中的元素添加到另一个链表中,并将原链表中的元素删除 |
unique() |
无 |
删除相邻的重复元素,或者按指定规则删除元素 |
std::list<int> lstSwap1 = {1,2,3,4,5};
std::list<int> lstSwap2 = {5,4,3,2,1};
lstSwap1.swap(lstSwap2);
std::swap(lstSwap1,lstSwap2);
lstSwap1 = {1,2,3,4,5};
lstSwap2 = {1,2,3,4,5};
lstSwap1.merge(lstSwap2);
lstSwap1 = {5,4,3,2,1};
lstSwap2 = {5,4,3,2,1};
lstSwap1.merge(lstSwap2,std::greater<int>());
lstSwap1.sort(std::greater<int>());
std::list<int> lstSplice1 = {5,4,3,2,1};
std::list<int> lstSplice2 = {5,4,3,2,1};
lstSplice1.splice(++lstSplice1.begin(), lstSplice2, ++lstSplice2.begin());
lstSplice1.splice(lstSplice1.begin(), lstSplice2, ++lstSplice2.begin(), --lstSplice2.end());
lstSplice1.splice(lstSplice1.end(), lstSplice2);
lstInt1 = {1,1,2,2,3,3,5,3,5};
lstInt1.unique();
std::not_equal_to<int> compare;
lstInt1.unique(compare);