C++硬货——list头文件【保姆级教学】

201 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

list容器

这是一个双向循环链表,采用的是动态存储分配,不会造成内存浪费和溢出的问题;插入和删除的操作方便,不需要移动大量元素~

PS: 接下来我将会从(list的构造函数)、(list的赋值和交换)、(list的大小操作)、(list插入和删除)、(list的数据存取)、(list的反转和排序)等方面来一一介绍list容器,每个案例都会有代码和图片说明~

list构造函数

  • list<T>l;默认构造函数
  • list(beg,end);将区间[beg,end)拷贝构造
  • list(n,elem);将n个elem构造
  • list(const list);拷贝构造

代码

//list构造
void test01() {
	//1.默认构造
	list<int>l;
	for (int i = 1; i <= 10; i++)
		l.push_back(i);
	display(l);

	//2.区间方式
	list<int>l2(l.begin(),l.end());
	display(l2);

	//3.拷贝构造
	list<int>l3(l2);
	display(l3);

	//4.n个elem
	list<int>l4(10, 666);
	display(l4);
}

结果

image.png

list赋值和交换

  • assign(beg,end);将[beg,end)赋值给l
  • assign(n,elem);将n个elem赋值给l
  • =号赋值
  • swap(list);将l与list的所有元素交换

代码

//list赋值和交换
void test02() {
	list<int>l1;
	for (int i = 1; i <= 10; i++)
		l1.push_back(i);
	display(l1);

	//区间赋值
	list<int>l2;
	l2.assign(l1.begin(), l1.end());
	display(l2);

	//n个elem
	list<int>l3;
	l3.assign(10, 6666);
	display(l3);

	//=赋值
	list<int>l4 = l3;
	display(l4);

	//交换
	l4.swap(l1);
	display(l4);
}

结果

image.png

list大小操作

  • size();返回list元素个数
  • empty();判断list是否为空
  • resize(num);重新指定长度,若变长,则按默认填充;变短,删除
  • resize(int num,int elem);重新指定长度,若变长,则按elem填充;变短,删除

代码

//list大小操作
void test03() {
	list<int>l1;
	for (int i = 1; i <= 10; i++)
		l1.push_back(i);
	display(l1);

	if (l1.empty())
		cout << "l1为空!" << endl;
	else
		cout << "l1的大小为:" << l1.size() << endl;

	list<int>l2 = l1;
	l1.resize(15);
	display(l1);
	l1.resize(5);
	display(l1);

	l2.resize(15, 999);
	display(l2);
	l2.resize(5);
	display(l2);
}

结果

image.png

list插入和删除

  • push_back(elem);尾加elem
  • pop_back();尾减元素
  • push_top(elem);头加elem
  • pop_top();头减元素
  • insert(pos,elem);pos插入elem
  • insert(pos,n,elem);pos插入n个elem
  • insert(pos,beg,end);pos插入[beg,end)区间数据
  • clear();清空
  • erase(beg,end);删除[beg,end)数据,返回下一个数据的位置
  • erase(pos);删除pos,返回下一个位置
  • remove(elem);删除容器中所有与elem值相等的元素

代码

//list插入和删除
void test04() {
	list<int>l1;
	for (int i = 1; i <= 10; i++)
		l1.push_back(i);
	display(l1);
	l1.insert(++l1.begin(), 4, 99);
	display(l1);

	//remove
	l1.remove(99);
	display(l1);
}

结果

image.png

list数据存取

  • front();头部第一个元素
  • back();尾部第一个元素
  • 没有[]和at等操作 PS: 由于比较简单,这里不进行代码展示

list反转和排序

  • 需要加入<algorithm>头文件
  • reserve();将list所有函数反转
  • sort();将list所有函数排序(可以借助仿函数更改排序规则)

更改排序规则的仿函数代码

bool myCompare(int v1, int v2) {
	//降序  让第一个数大于第二个数
	return v1 > v2;
}

总代码

//list反转和排序
void test05() {
	list<int>l1;
	for (int i = 1; i <= 10; i++)
		l1.push_back(i);
	display(l1);
	l1.push_back(1);
	l1.insert(++l1.begin(), 2, 90);
	display(l1);

	//反转函数
	l1.reverse();
	display(l1);

	//排序函数
	l1.sort();
	display(l1);

	//降序
	l1.sort(myCompare);
	display(l1);
}

结果

image.png PS: 觉得好就点赞加收藏吧~