list容器

list容器基本概念

  • list是一种将数据进行链式存储的数据结构,被称为链表(双向循环列表)
  • 链表的存储方式不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器,不支持+2,支持++
  • 插入和删除操作都不会造成原有的迭代器失效 , 这在vector中不成立,因为vector的动态扩容机制会改变原有数据的存储地址,地址改变了,迭代器自然失效了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

list的常用接口

list的构造函数

函数原型:

  1. list<T> lst; //默认构造,list采用模板类实现
  2. list(begin,end); //构造函数,利用迭代器实现区间赋值
  3. list(n,elem); //构造函数,将n个elem赋值给本身
  4. list(const list &lst); //拷贝构造

list的赋值和交换

函数原型:


 1.list& operator=(const list& lst);  //重载赋值运算符
 2.assign(begin,end);                 //利用迭代器实现区间赋值
 3.assign(n,elem);                    //将n个elem赋值给本身
 4.swap(lst);                         //将lst于本身互换

测试案例:

void text2()
{
	list<int> lst1, lst2, lst3, lst4;
	for (int i = 1; i < 10; ++i)
	{
		lst1.push_back(i);
	}
	printList(lst1);

	lst2 = lst1;                           //重载的 = 赋值
	printList(lst2);

	lst3.assign(lst2.begin(), lst2.end()); //区间赋值
	printList(lst3);

	lst4.assign(9, 1);                     //将9个1赋值给本身
	printList(lst4);

	//list交换
	lst1.swap(lst4);
	cout << "交换后:" << endl;
	printList(lst1);
	printList(lst4);
}

list的大小操作

函数原型:

 
 1.size();            //返回容器中元素个数
 2.empty();           //判断容器是否为空
 3.resize(num);       //重新指定容器长度,若变长,变长的部分赋值为0,
                  //若变短,超出容器长度的元素被删除
                      
 4.resize(num,elem);  //重新指定容器长度,若变长,变长的部分赋值为elem
                      //若变短,超出容器长度的元素被删除

测试案例:

void text3()
{
	list<int> lst1;
	for (int i = 1; i < 10; ++i)
	{
		lst1.push_back(i);
	}
	printList(lst1);

	if (!lst1.empty())  //容器若不为空
	{
		cout << "list容器的大小为:" << lst1.size() << endl;
	}
	
	cout << "重新指定长度,使容器变长: " << endl;
	lst1.resize(15);     //等价于lst1.resize(15,0);
	printList(lst1);

	cout << "重新指定长度,使容器变短: " << endl;
	lst1.resize(5);     
	printList(lst1);
}

list的插入和删除

函数原型:

 
 1.push_back(elem);      //在容器尾部插入一个元素
 2.push_front(elem);     //在容器头部插入一个元素
 3.pop_back();           //在容器尾部删除一个元素
 4.pop_front();          //在容器头部删除一个元素
 5.insert(pos,elem);     //在迭代器pos处插入一个元素elem,返回新数据的位置
 6.insert(pos,n,elem);   //在迭代器pos处插入n个元素elem,无返回值
 7.insert(pos,begin,end);//在迭代器pos处插入[begin,end)区间的数据,无返回值
 8.clear();              //清除容器中所有数据
 9.erase(begin,end);     //删除[begin,end)区间的数据,返回下一个数据的位置
 10.erase(pos);          //删除迭代器pos处的数据,返回下一个数据的位置
 11.remove(elem);        //删除容器中所有等于elem的元素

测试案例:

void text4()
{
	list<int> lst1;
	for (int i = 1; i < 6; ++i)
	{
		lst1.push_back(i+5);     //在容器尾部插入一个元素
		lst1.push_front(6 - i);  //在容器头部插入一个元素
	}
	printList(lst1);

	lst1.pop_back();        //在容器尾部删除一个元素
	lst1.pop_front();       //在容器尾部删除一个元素
	printList(lst1);

	list<int> lst2;
	//在lst2头部插入lst1的全部数据
	lst2.insert(lst2.begin(),lst1.begin(), lst1.end());
	lst2.insert(lst2.end(), 5, 10);  //在lst2尾部插入5个10
	printList(lst2);

	lst2.remove(10);   //删除lst2中等于10的元素
	printList(lst2);
	
	//删除lst2中所有元素
	lst2.erase(lst2.begin(), lst2.end());   //等价于lst2.clear();
	printList(lst2);
}

list的数据存取

 
 1.front();   //返回容器第一个元素
 2.back();    //返回容器最后一个元素

list的反转与排序

1.reverse(); //反转链表
2.sort();    //排序链表。注意这是一个成员函数,测试中会解释

测试案例:

void text6()
{
	list<int> lst1;
	lst1.push_back(5);
	lst1.push_back(1);
	lst1.push_back(7);
	lst1.push_back(3);
	lst1.push_back(6);
	printList(lst1);
	//反转
	cout << "反转后:" << endl;
	lst1.reverse();
	printList(lst1);
	//排序
	//sort(lst1.begin(),lst1.end())//错误
	//所有不支持随机访问迭代器的容器,不能使用标准算法
	//但不支持随机访问迭代器的容器,内部会提供一些算法来弥补
	lst1.sort();  //list容器内部的排序算法
	printList(lst1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值