C++STL list

1.简介

STL中的list是一种双循环链表的存储结构,物理存储单元上非连续,数据元素的逻辑顺序是通过链表中的指针链接实现的。链表由一系列结点组成,结点包括存储数据元素的数据域,以及存储前一个结点和后一个结点的地址的指针域。

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。简单说就是list的迭代器只能自增或自减,不能使用“+”与其他数相加

优点:可以快速删除或插入某一个元素。

缺点:占用空间大,遍历麻烦。

2.创建

就是STL常见的四种创建方式:

//四种创建方式
list L;   //创建空list
L.push_back(1);
L.push_back(2);
L.push_back(3);
L.push_back(4);
L.push_back(5);
L.push_back(6);

listL1(L.begin(), L.end());   //拷贝另一个list的部分值

listL3(L1);   //直接拷贝另一个list

listL4(10, 1000);   //list L(n,elem);   创建一个含有n个相同元素elem的list

3.赋值

常见的STL 两种赋值:

1.assign()函数赋值

2.等号赋值。

list Lb;   //等号赋值
Lb = La;

listLc;   //两种assign()赋值
//Lc.assign(La.begin()+1, La.end() - 1);//错误代码
Lc.assign(La.begin(), La.end());

list Ld;
Ld.assign(9, 19);   // L.assign(n,elem);   n个相同元素elem赋值给list

4.插入,删除

 list容器无法与其他容器一样直接选定索引位置插入或删除元素,因为list容器属于链式结构,其迭代器只能进行自增或者自减操作。(”+1“也不行,必须写成“++”)
 

//插入元素
L0.push_back(elem);   //尾部插入元素elem
L0.push_front(elem);   //头部插入元素elem

//指定位置插入元素
list::iterator it = L0.begin();
L0.insert(it,elem);   
L0.insert(++L0.begin(),elem);



//删除元素
L0.pop_back();   //尾部删除元素
L0.pop_front();  //头部删除元素

//指定位置删除元素
list::iterator it1 = L0.begin();
L0.erase(++it1);
L0.erase(++L0.begin(), --L0.end());

5.访问

L.front();   //返回首元素
L.back();   //返回末尾元素

6.遍历

list容器可以用迭代器遍历

list::iterator it = L0.begin();
for (list::iterator it = L0.begin(); it != L0.end(); it++)
{
	cout << *it;
}

7.方法函数

//6.1返回容器大小
L.size() 

//6.2判断容器是否为空
L.empty() << endl;

//6.3重定义容器长度
L.resize(a, elem);//重定义list长度为a,若新list长度超过原有,则用elem填充,默认填充值为0

//6.4互换两容器的元素
L.swap(L0);   //两链表交换元素

//6.5容器元素反转
L.reverse();

//6.6容器内元素排序
L.sort();

//6.7移除所有匹配的元素
L.remove(elem);

//6.8清空容器
L.clear();

8.测试代码源码:

#include
#include

using namespace std;

void test06(list L0);

//test03赋值
void test03(list L0)
{
	cout << "test03赋值:" << endl;
	list La;   
	La.push_back(10);
	La.push_back(20);
	La.push_back(10);
	La.push_back(20);
	La.push_back(10);
	La.push_back(20);

	list Lb;   //等号赋值
	Lb = La;
	test06(Lb);
	cout << endl;

	listLc;   //两种assign()赋值
	//Lc.assign(La.begin()+1, La.end() - 1);//错误代码
	Lc.assign(La.begin(), La.end());
	test06(Lc);
	cout << endl;

	list Ld;
	Ld.assign(9, 19);   // L.assign(n,elem);   n个相同元素elem赋值给list
	test06(Ld);
	cout << endl;

}
//test04插入,删除
void test04(list L0)
{
	cout << "test04插入,删除:" << endl;
	//4.1插入元素
	L0.push_back(11);   //尾部插入11
	L0.push_front(22);   //首元素插入22

	//指定位置插入元素
	list::iterator it = L0.begin();
	L0.insert(it,33);
	L0.insert(L0.begin(),44);
	test06(L0);
	cout << endl;


	//4.2删除元素
	L0.pop_back();
	L0.pop_front();

	//指定位置删除元素
	list::iterator it1 = L0.begin();
	L0.erase(++it1);
	L0.erase(++L0.begin(), --L0.end());
	//list容器无法与其他容器一样直接选定索引位置插入元素,
	//因为其迭代器只能进行自增或者自减操作
	cout << "04删除后为:";
	test06(L0);
	cout << endl;
}


//test05访问
void test05(list L0)
{
	cout << "test05访问:" << endl;
	//4.3访问元素
	cout << "04首元素为:" << L0.front() << endl;
	cout << "04尾元素为:" << L0.back() << endl;
	//list容器不可以通过[]索引或at()函数的方式访问元素,可以用迭代器进行单个元素访问
}




//test06遍历
void test06(list L0)
{
	//cout << "遍历:" << endl;
	//list容器可以使用迭代器遍历
	list::iterator it = L0.begin();
	for (list::iterator it = L0.begin(); it != L0.end(); it++)
	{
		cout << *it;
	}
	cout << endl;
}


//test07方法函数
void test07(list L0)
{
	cout << "test07方法函数:" << endl;
	//6.1返回容器大小
	//6.2判断容器是否为空
	//6.3重定义容器长度
	//6.4互换两容器的元素
	//6.5容器元素反转
	//6.6容器内元素排序
	//6.7移除所有匹配的元素
	//6.8清空容器


	list L1;
	L1.assign(6, 1);
	L1.push_back(9);
	L1.push_back(9);

	list L2;
	L2.assign(3, 2);
	L2.push_back(3);
	L2.push_back(4);


	//6.1返回容器大小
	cout <<"容器大小:"<< L1.size() << endl;
	//6.2判断容器是否为空
	cout << "判断容器是否为空:" << L1.empty() << endl;

	//6.3重定义容器长度
	L1.resize(9, 0);
	cout << "重定义L1容器长度为9:";
	test06(L1);
	//6.4互换两容器的元素
	L1.swap(L2);   //两链表交换元素
	cout << "交换后的L1结果为:";
	test06(L1);
	//6.5容器元素反转
	L1.reverse();
	cout << "L1反转后的结果为:";
	test06(L1);
	//6.6容器内元素排序
	L1.sort();
	cout << "L1排序后:";
	test06(L1);

	//6.7移除所有匹配的元素
	L1.remove(2);
	cout << "L1中移除2后:";
	test06(L1);
	//6.8清空容器
	L1.clear();
	cout << "清空L1后的结果为:";
	test06(L1);


}




int main() {
	//四种创建方式

	list L;   //创建空list
	L.push_back(1);
	L.push_back(2);
	L.push_back(3);
	L.push_back(4);
	L.push_back(5);
	L.push_back(6);

	listL1(L.begin(), L.end());   //拷贝另一个list的部分值

	listL3(L1);   //直接拷贝另一个list

	listL4(10, 1000);   //list L(n,elem);   创建一个含有n个相同元素elem的list


	test03(L);
	test04(L);
	test05(L);
	cout << "test06遍历:" ;
	test06(L);
	cout << endl;
	test07(L);

}

你可能感兴趣的:(c++,list,开发语言)