std::list
介绍
成员函数
非成员函数
介绍
// list 模板定义
template<class T, class Allocator = std::allocator<T>> class list;
namespace pmr {
template< class T >
using list = std::list<T, std::pmr::polymorphic_allocator<T>>;
}
- std::list 介绍摘选自 cppreference.com 中文网 std::list 介绍
- std::list 是支持常数时间从容器任何位置插入和移除元素的容器
- 不支持快速随机访问。它通常实现为双向链表
- 与 std::forward_list 相比,此容器提供双向迭代但在空间上效率稍低
- 在 list 内或在数个 list 间添加、移除和移动元素不会是迭代器或引用失效
- 迭代器只有在对应元素被删除时才会失效
成员函数
构造析构
#include <QCoreApplication>
#include <iostream>
#include <list>
#include <string>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
std::cout << msg << " : ";
for (int val : deq)
std::cout << val << "\t";
std::cout << "\n";
};
using list_int = std::list<int>; // 声明整型列表类型
list_int test{10, 20, 30, 40, 50}; // 测试数据
Print("test", test);
list_int l1; // 默认构造函数
Print("l1", l1);
std::allocator<int> alloc;
list_int l2(alloc); // 设置分配器
Print("l2", l2);
list_int l3(10, -1, alloc); // 设置数量,值,分配器
Print("l3", l3);
list_int l4(10); // 设置数量
Print("l4", l4);
list_int l5(test.begin(), test.end(), alloc); // 使用迭代器初始化容器
Print("l5", l5);
list_int l6(l5); // 使用列表初始化
Print("l6", l6);
list_int l7(l6, alloc); // 使用列表初始化,指定分配器
Print("l7", l7);
list_int l8(std::move(l7)); // 使用移动构造
Print("l8", l8);
list_int l9(std::move(l8), alloc); // 使用移动构造,指定分配器
Print("l9", l9);
list_int l10{1, 2, 3, 4, 5, 6, 7, 8, 9}; // 使用初始化列表构造
Print("l10", l10);
std::initializer_list<int> lt{1, 2, 3, 4, 5, 6, 7, 8, 9};
list_int l11(lt); // 使用初始化列表构造
Print("l11", l11);
list_int l12 = test; // 使用operator = 赋值,也可创建后使用 assign 函数赋值
Print("l12", l12);
// 析构函数默认
return 0; // a.exec();
}
输出结果:
test : 10 20 30 40 50
l1 :
l2 :
l3 : -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
l4 : 0 0 0 0 0 0 0 0 0 0
l5 : 10 20 30 40 50
l6 : 10 20 30 40 50
l7 : 10 20 30 40 50
l8 : 10 20 30 40 50
l9 : 10 20 30 40 50
l10 : 1 2 3 4 5 6 7 8 9
l11 : 1 2 3 4 5 6 7 8 9
l12 : 10 20 30 40 50
元素访问
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
std::cout << msg << " : ";
for (int val : deq)
std::cout << val << "\t";
std::cout << "\n";
};
using list_int = std::list<int>; // 声明整型列表类型
list_int test{10, 20, 30, 40, 50}; // 测试数据
Print("test", test);
std::cout << "index 0 : " << test.front() << std::endl;
std::cout << "index 0 : " << test.front() << std::endl;
std::cout << "index 4 : " << test.back() << std::endl;
std::cout << "index 4 : " << test.back() << std::endl;
return 0; // a.exec();
}
输出结果:
test : 10 20 30 40 50
index 0 : 10
index 0 : 10
index 4 : 50
index 4 : 50
迭代器
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
using list_int = std::list<int>; // 声明整型列表类型
list_int test{10, 20, 30, 40, 50}; // 测试数据
list_int::iterator iter = test.begin(); // 返回指向起始的迭代器
for (; iter != test.end(); iter++) {
std::cout << *iter << "\t";
}
std::cout << "\n";
list_int::const_iterator citer = test.begin(); // 返回指向起始的迭代器,const
for (; citer != test.end(); citer++) {
std::cout << *citer << "\t";
}
std::cout << "\n";
list_int::reverse_iterator riter = test.rbegin(); // 返回指向末尾的逆向迭代器
for (; riter != test.rend(); riter++) {
std::cout << *riter << "\t";
}
std::cout << "\n";
list_int::const_reverse_iterator criter =
test.crbegin(); // 返回指向末尾的 const 逆向迭代器,const
for (; criter != test.crend(); criter++) {
std::cout << *criter << "\t";
}
std::cout << "\n";
return 0; // a.exec();
}
输出结果:
10 20 30 40 50
10 20 30 40 50
50 40 30 20 10
50 40 30 20 10
容量
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
using list_int = std::list<int>; // 声明整型列表类型
list_int test{10, 20, 30, 40, 50}; // 测试数据
std::cout << std::boolalpha << "test.empty : " << test.empty()
<< "\n"; // 检查容器是否为空
std::cout << std::boolalpha << "test.size : " << test.size()
<< "\n"; // 返回容纳的元素数
std::cout << std::boolalpha << "test.max_size : " << test.max_size()
<< "\n"; // 返回可容纳的最大元素数,和平台有关
return 0; // a.exec();
}
输出结果:
test.empty : false
test.size : 5
test.max_size : 768614336404564650
修改器
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
std::cout << msg << " : ";
for (int val : deq)
std::cout << val << "\t";
std::cout << "\n";
};
using list_int = std::list<int>; // 声明整型列表类型
list_int test{10, 20, 30, 40, 50}; // 测试数据
Print("test", test);
test.clear(); //清除内容
Print("test", test);
test.insert(test.begin(), 10); // 插入元素
Print("test", test);
test.emplace(test.begin(), 20); //原位构造元素
Print("test", test);
test.erase(test.begin()); //擦除元素
Print("test", test);
test.push_back(30); // 将元素添加到容器末尾
Print("test", test);
test.emplace_back(40); // 在容器末尾就地构造元素
Print("test", test);
test.pop_back(); // 移除末元素
Print("test", test);
test.push_front(50); //插入元素到容器起始
Print("test", test);
test.emplace_front(60); //在容器头部原位构造元素
Print("test", test);
test.pop_front(); // 移除首元素
Print("test", test);
test.resize(10); // 改变容器中可存储元素的个数
Print("test", test);
list_int l1;
l1.swap(test); // 交换内容
Print("test", test);
Print("l1", l1);
return 0; // a.exec();
}
输出结果:
test : 10 20 30 40 50
test :
test : 10
test : 20 10
test : 10
test : 10 30
test : 10 30 40
test : 10 30
test : 50 10 30
test : 60 50 10 30
test : 50 10 30
test : 50 10 30 0 0 0 0 0 0 0
test :
l1 : 50 10 30 0 0 0 0 0 0 0
操作
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
std::cout << msg << " : ";
for (int val : deq)
std::cout << val << "\t";
std::cout << "\n";
};
using list_int = std::list<int>; // 声明整型列表类型
list_int l1{10, 20, 30, 40, 50}; // 测试数据
list_int l2{50, 80, 90, 100, 110}; // 测试数据
Print("l1", l1);
Print("l2", l2);
l1.merge(l2); // 合并二个已排序列表
Print("l1", l1);
Print("l2", l2);
list_int l3{50, 90, 150};
l1.splice(l1.end(), std::move(l3), l3.begin(),
l3.end()); // 从另一个list中移动元素
Print("l1", l1);
l1.remove(100);
Print("l1", l1);
l1.remove_if(
[&](int o) -> bool { return o > 100; }); // 移除满足特定标准的元素
Print("l1", l1);
l1.reverse(); // 将该链表的所有元素的顺序反转
Print("l1", l1);
l1.unique(); // 删除连续的重复元素
Print("l1", l1);
l1.sort(); // 对元素进行排序
Print("l1", l1);
return 0; // a.exec();
}
输出结果:
l1 : 10 20 30 40 50
l2 : 50 80 90 100 110
l1 : 10 20 30 40 50 50 80 90 100 110
l2 :
l1 : 10 20 30 40 50 50 80 90 100 110 50 90 150
l1 : 10 20 30 40 50 50 80 90 110 50 90 150
l1 : 10 20 30 40 50 50 80 90 50 90
l1 : 90 50 90 80 50 50 40 30 20 10
l1 : 90 50 90 80 50 40 30 20 10
l1 : 10 20 30 40 50 50 80 90 90
非成员函数
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
auto Print = [](const std::string &msg, const std::list<int> &deq) { // 打印
std::cout << msg << " : ";
for (int val : deq)
std::cout << val << "\t";
std::cout << "\n";
};
using list_int = std::list<int>; // 声明整型列表类型
list_int l1{1, 2, 3, 4, 5}; // 初始化列表构造函数
list_int l2{1, 2, 3, 4, 6};
std::cout.setf(std::ios::boolalpha);
std::cout << "l1 == l2 : " << (l1 == l2) << std::endl;
std::cout << "l1 != l2 : " << (l1 != l2) << std::endl;
std::cout << "l1 > l2 : " << (l1 > l2) << std::endl;
std::cout << "l1 >= l2 : " << (l1 >= l2) << std::endl;
std::cout << "l1 < l2 : " << (l1 < l2) << std::endl;
std::cout << "l1 <= l2 : " << (l1 <= l2) << std::endl;
std::cout.unsetf(std::ios::boolalpha);
// c++20 废弃以上操作符重载,提供三路运算符 operator <=> ()
Print("l1", l1);
Print("l2", l2);
std::swap(l1, l2);
Print("l1", l1);
Print("l2", l2);
return 0; // a.exec();
}
输出结果:
l1 == l2 : false
l1 != l2 : true
l1 > l2 : false
l1 >= l2 : false
l1 < l2 : true
l1 <= l2 : true
l1 : 1 2 3 4 5
l2 : 1 2 3 4 6
l1 : 1 2 3 4 6
l2 : 1 2 3 4 5