list容器

倖福魔咒の 提交于 2020-01-31 11:27:51

导航:

1.list容器的基本概念(功能,组成,优缺点)
2.list 容器的构造函数
3.list 容器的赋值操作
4.list 容器的大小容量
5.list 容器的插入与删除
6.list 容器数据存取
7.list 容器反转和排序
———————————————————————————————————
1.list容器的基本概念
功能:将数据进行链式存储。
链表:是一种物理存储单元非连续的存储结构,数据元素中的逻辑顺序通过指针链表实现。

链表组成:一系列的结点
结点组成:一个是存储数据元素的数据域,另一个是存储下一个结点的地址

STL中链表是一个双向循环列表

优点:对任意位置可以快速添加,删除元素(动态分配,不会造成浪费)。
缺点:遍历没有数组遍历的快,并且占用空间比较大。

链表中存储方式不是连续内存空间,list中迭代器只支持前移后移,属于双向迭代器
插入删除元素不影响迭代器失效,vector不成立(动态分配内存对导致内存改变从而失效)

———————————————————————————————————
2.list 容器的构造函数

list< T >v; //默认构造函数
list(v.begin(),v.end()); //将[ begin(),end())中的拷贝到本身
list(n,elem); //构造函数将n个elem数据拷贝本身
list(const vector &vec); //拷贝构造函数

例子:

#include <iostream>
using namespace std;
#include <list>

void PrintList(const list<int>& L)  //遍历list容器
{
	for(list<int>::const_iterator it = L.begin();it!=L.end();it++)
	{
		cout<<(*it)<<" ";
	}
	cout<<endl;
}

void test()
{
	//创建list容器
	list<int> L;  //默认构造
	L.push_back(10);
	L.push_back(20);
	L.push_back(30);
	L.push_back(40);
	PrintList(L);

	//区间构造
	list<int> L1(L.begin(),L.end());
	PrintList(L1);

	//n个elem
	list<int> L2(5,100);
	PrintList(L2);

	//拷贝构造
	list<int> L3(L2);
	PrintList(L3);
}

int main()
{
	test();
	system("pause");
	return 0;
}

———————————————————————————————————
3.list 容器的赋值操作

普通赋值 .push_back()
operator= 赋值
assign 区间赋值
assign n个elem赋值
swap() //互换容器

例子:

#include <iostream>
using namespace std;
#include <list>

void PrintList(const list<int>& L)  //遍历list容器
{
	for(list<int>::const_iterator it = L.begin();it!=L.end();it++)
	{
		cout<<(*it)<<" ";
	}
	cout<<endl;
}

void test()
{
	list<int> L1;

	L1.push_back(10); //尾插
	L1.push_back(20);
	L1.push_back(30);
	L1.push_back(40);
	PrintList(L1);

	list<int> L2;
	L2 = L1;   //operator= 赋值
	PrintList(L2);

	list<int> L3;
	L3.assign(L2.begin(),L2.end());  //assign 区间
	PrintList(L3);

	list<int> L4;
	L4.assign(5,100);  //assign n个elem赋值
	PrintList(L4);
}

int main()
{
	test();
	system("pause");
	return 0;
}

———————————————————————————————————
4.list 容器的大小容量

.empty() //判断容器是否为空
.size() //返回容器中的元素个数
.resize(int num) //重新指定容器长度为num,容器变长,则以默认值0填充到新位置;变短超出元素被删
.resize(int num.int elem) //同上,不过多出来的位置填充elem

———————————————————————————————————
5.list 容器的插入与删除

pop,push,insert,erase(用迭代器),remove(elem)(移除所有elem值),clear()

———————————————————————————————————
6.list 容器数据存取
不支持迭代器随机访问
支持递增,递减

front(),back()

例子:

#include <iostream>
using namespace std;
#include <list>

void test()
{
	list<int> L1;

	L1.push_back(10); //尾插
	L1.push_back(20); 
	L1.push_back(30); 
	L1.push_back(40); 
	cout<<L1.front()<<endl;
	cout<<L1.back()<<endl;
	list<int>::iterator it = L1.begin();
	it++;   //支持递增 
	cout<<(*it)<<endl;
	it--;   //支持递减

}

int main()
{
	test();
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
———————————————————————————————————
7.list 容器反转和排序

反转 reverse()
排序 sort() //升序 sort(compare) //降序,添加一个返回值为bool的函数

例子:

#include <iostream>
using namespace std;
#include <list>

void PrintList(const list<int>&L)
{
	for(list<int>::const_iterator it = L.begin();it!=L.end();it++)
	{
		cout<<(*it)<<" ";
	}
	cout<<endl;
}

bool compare(int val1,int val2)   //写一个返回值为bool类型的函数
{
	return val1>val2;
}

//list反转和排序
void test()
{
	list<int> L1;

	L1.push_back(10); //尾插
	L1.push_back(20); 
	L1.push_back(30); 
	L1.push_back(40); 
	//反转前
	cout<<"反转前:"<<endl;
	PrintList(L1);
	L1.reverse();  //反转
	cout<<"反转后:"<<endl;
	PrintList(L1);

	//排序后
	//所有不支持随机访问迭代器的容器,不可以用标准算法
	//不支持随机访问迭代器的容器,内部会提供对应一些算法
	L1.sort();  //可以直接调用
	cout<<"排序后:"<<endl;
	PrintList(L1);

	//进行降序排序
	cout<<"进行降序排序:"<<endl;
	L1.sort(compare);   //将函数名放进去
	PrintList(L1);
}

int main()
{
	test();
	system("pause");
	return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!