C++ list类容器常用操作

文章目录

list本质就是链表。

初始化

初始化操作。

cpp 复制代码
list<int> lt;

list空间增长

size

返回list中有效节点的个数。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.size();

empty

检测list是否为空,是返回true,否则返回false。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.empty();

list元素存取

front

返回list的第一个节点中值的引用。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
cout << lt.front() << endl;  //1

back

返回list的最后一个节点中值的引用。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
cout << lt.back() << endl;  //3

list常用函数

push_front

在list首元素前插入值val的元素。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_front(0); // 0 1 2 3

pop_front

删除list中第一个元素。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.pop_front(); // 2 3

push_back

在list尾部插入值为val的元素。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
 // 1  2 3

pop_back

删除list中最后一个元素。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.pop_back(); // 1  2 

insert

在list position位置中插入值为val的元素,会返回list position位置的迭代器。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
auto it = find(lt.begin(), lt.end(), 2);
lt.insert(it, 9); // 1 9 2 3

在list position位置的下一个位置中插入值为val的元素。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
auto it = find(lt.begin(), lt.end(), 2);
lt.insert(next(it), 9); // 1 2  9 3

erase

删除list position位置的元素,删除完之后,会返回下一个位置的迭代器。

cpp 复制代码
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
auto it = find(lt.begin(), lt.end(), 2);
lt.erase(it); // 1 3

swap

交换两个list中的元素。

cpp 复制代码
list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);
list<int> lt2;
lt2.push_back(10);
lt2.push_back(9);
lt2.push_back(8);
swap(lt1, lt2);

clear

清空list中的有效元素。

cpp 复制代码
list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);

lt1.clear();
cout << lt1.size() << endl;  //0

链表中的sort

链表的排序效率相比vector较差,当数据足够多的时候。可以将链表中的值拷贝到vector中,排完序后在拷贝回链表中。

cpp 复制代码
void test_list() {
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(4);
	lt.push_back(5);

	lt.sort();
	for (auto& e : lt) {
		cout << e << " ";
	}
	// 1 1 2 2 3 3 4 4 5 5
	cout << endl;
	//链表的排序效率相比vector较差,当数据足够多的时候。可以将链表中的值拷贝到vector中
	//排完序后在拷贝回链表中
	lt.sort(greater<int>());
	for (auto& e : lt) {
		cout << e << " ";
	}
	//5 5 4 4 3 3 2 2 1 1
	cout << endl;
}

reverse

进行逆置。

cpp 复制代码
void test_list4() {
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	lt.reverse();
	for (auto& e: lt) {
		cout << e << " ";
	}
	//5 4 3 2 1
	cout << endl;
}

merge

将两个链表进行合并。

cpp 复制代码
void test_list() {
	list<int> first; 
	first.push_back(1);
	first.push_back(2);
	first.push_back(3);

	list<int> second;
	second.push_back(4);
	second.push_back(5);
	second.push_back(6);

	first.merge(second);
	for (auto& e : first) {
		cout << e << " ";
	}
	//1 2 3 4 5 6
	cout << endl;
}

unique

要求列表有序,去重

cpp 复制代码
void test_list() {
	list<int> lt;
	lt.push_back(1);
	lt.push_back(1);
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	//要求列表有序 去重
	lt.unique();
	for (auto& e : lt) {
		cout << e << " ";
	}
	//1 2 3
	cout << endl;
}

remove

删除列表中出现的所有val值。

cpp 复制代码
void test_list7() {
	list<int> lt;
	lt.push_back(1);
	lt.push_back(1);
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.remove(1);
	for (auto& e : lt) {
		cout << e << " ";
	}
	//2 3
	cout << endl;
}

splice

在特定的位置拼接两个链表。

cpp 复制代码
void test_list8() {
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(1);
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);

	list<int> lt2;
	lt2.push_back(9);
	lt2.push_back(10);
	lt2.push_back(11);
	lt2.push_back(12);
	lt2.push_back(13);

	auto it = lt1.begin();
	++it;
	lt1.splice(it, lt2);
	for (auto& e : lt1) {
		cout << e << " ";
	}
	//将lt2转移到lt1的第二个位置开始
	//1 9 10 11 12 13 1 1 2 3

	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(6);
	int x = 2;

	it = find(lt.begin(), lt.end(), x);
	if (it != lt.end()) {
		//        目标位置    表示移动元素的来源链表   要移动范围的起始迭代器   要移动范围的结束迭代器
		lt.splice(lt.begin(), lt, it, lt.end());
	}
	for (auto& e : lt) {
		cout << e << " ";
	}// 2 3 4 5 6 1
}

list支持直接传构造的参数 emplace_back

cpp 复制代码
class A {
public:
	A(int a1 = 1, int a2 = 1)
		:_a1(a1),
		_a2(a2)
	{}

private:
	int _a1;
	int _a2;
};

void test_list() {
	list<A> lt;
	A aa1(1, 1);
	lt.emplace_back(aa1);
	lt.emplace_back(A(2, 2));
	//支持直接传构造A对象的参数
	lt.emplace_back(3, 3);
}

觉得我回答有用的话,记得点个关注哟!谢谢支持!

相关推荐
xlp666hub6 小时前
Leetcode第七题:用C++解决接雨水问题
c++·leetcode
肆忆_7 小时前
实战复盘:手写 C++ 虚拟机的高性能并行 GC (Thread Pool + Work Stealing)
c++
肆忆_7 小时前
虚函数进阶答疑:把上一篇博客评论区里最容易卡住的问题,一次追到底
c++
saltymilk1 天前
使用 C++ 模拟 ShaderLanguage 的 swizzle
c++·模板元编程
xlp666hub1 天前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
得物技术1 天前
搜索 C++ 引擎回归能力建设:从自测到工程化准出|得物技术
c++·后端·测试
xlp666hub2 天前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
会员源码网2 天前
构造函数抛出异常:C++对象部分初始化的陷阱与应对策略
c++
xlp666hub2 天前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
不想写代码的星星2 天前
static 关键字:从 C 到 C++,一篇文章彻底搞懂它的“七十二变”
c++