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);
}

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

相关推荐
Ivanqhz8 分钟前
Unigram 算法
开发语言·人工智能·python·深度学习·mlir
Jazz_z18 分钟前
如何用 C# 读取 Word 中的表格数据
开发语言·c#
郝学胜-神的一滴37 分钟前
C++20模板元编程 04:变量模板 别名模板与模板Lambda实战
服务器·开发语言·数据结构·c++·程序人生
驭渊的小故事1 小时前
Java 项目-jckson序列化工具
java·开发语言
君顾11 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到功能实现
java·开发语言·健身房
qq_344920561 小时前
Qt事件过滤器
开发语言·c++·qt
执明wa1 小时前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio
码匠许师傅1 小时前
【C++三方组件】fmt:C++字符串格式化的前世今生
c++
程序员yu1 小时前
数智码力:Python作用域完全梳理,全局变量局部变量不再混乱
开发语言·python·学习