当前位置: 首页 > article >正文

【C++】18___list容器

目录

一、list基本概念

二、list构造函数

三、list赋值和交换

四、list大小操作

五、list插入和删除

六、list数据存取

七、list反转和排序


一、list基本概念

功能:将数据进行链式存储。

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。

链表的组成:链表是由一系列结点组成。

结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

STL中的链表是一个双向循环表。

由于链表的存储方式并不是连续的内存空间,因此链表list的迭代器只支持前移和后移,属于双向迭代器。

 list的优点:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list的缺点:

  • 链表灵活,但是指针域和时间消耗较大

STL中的list和vector是两个最常被使用的容器,各自都有优缺点

二、list构造函数

函数原型:

  • list<int>L1;  //list采用模板类实现,对象的默认构造函数
  • list(beg , eng);  //构造函数将[ beg , end)区间中的元素拷贝给本身
  • list(n , elem);  //构造函数将n个elem拷贝给本身
  • list(const list &L);  //拷贝构造函数

代码示例 

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

void printL(const list<int>&L){
	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);
	printL(L1);
	
	list<int>L2(L1.begin() , L1.end());
	printL(L2);
	
	list<int>L3(L2);
	printL(L3);
	
	list<int>L4(5 , 100);
	printL(L4);
}

int main(){
	
	test();
	return 0;
}

三、list赋值和交换

函数原型:

  • assign(beg , end);  //将[ beg , end)区间中的数据拷贝赋值给本身
  • assign(n , elem);  //将n个elem拷贝赋值给本身
  • list& operator=(const list &L);  //重载等号操作符
  • swap(L);  //将L与本身的元素互换

 代码示例

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

void printL(const list<int>&L){
	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);
	printL(L1);
	
	list<int>L2;
	L2.assign(L1.begin() , L1.end());
	printL(L2);
	
	list<int>L3;
	L3 = L2;
	printL(L3);
	
	list<int>L4;
	L4.assign(5 , 100);
	printL(L4);
	
	L4.swap(L3);
	printL(L3);
	printL(L4);
}

int main(){
	
	test();
	return 0;
}

四、list大小操作

函数原型:

  • size();  //返回容器中元素的个数
  • empty();  //判断容器是否为空
  • resize(num);  //重新指定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素删除。
  • resize( num , elem );  //重新指定容器的长度为num,若容器变长,则以elem填充新位置;如果容器变短,则末尾超出容器长度的元素删除。

 代码示例

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

void printL(const list<int>&L){
	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);
	printL(L1);
	
	if(L1.empty()){
		cout<<"L1为空";
	}else{
		cout<<"L1不为空"<<endl;
		cout<<"L1的元素个数:"<<L1.size()<<endl;
	}
	
	L1.resize(10 , 100);
	printL(L1);
	
	L1.resize(2);
	printL(L1);
}

int main(){
	
	test();
	return 0;
}

五、list插入和删除

函数原型:

  • push_back(elem);  //在容器尾部加入一个元素
  • pop_back();  //删除容器中最后一个元素
  • push_front(elem);  //在容器开头插入一个元素
  • pop_front();  //从容器开头移除第一个元素
  • insert(pos , elem);  //在pos位置插elem元素的拷贝,返回新数据的位置
  • insert(pos , n , elem);  //在pos位置插入n个elem元素的拷贝,无返回值
  • insert(pos , beg , eng);  //在pos位置插入[beg , end)区间的数据,无返回值
  • clear();  //移除容器中所有数据
  • erase(beg , end);  //删除[beg , end)区间的数据,返回下一个元素的位置
  • erase(pos);  //删除pos位置的数据,返回下一个数据的位置
  • remove(elem);  //删除容器中所有与elem值匹配的元素

代码示例

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

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

void test(){
	list<int>L1;
	L1.push_front(5);
	L1.push_front(4);
	L1.push_front(3);
	L1.push_front(2);
	L1.push_front(1);  //头插
	
	L1.push_back(6);
	L1.push_back(7);
	L1.push_back(8);
	L1.push_back(9);  //尾插
	printL(L1);  // 1 2 3 4 5 6 7 8 9
	
	L1.pop_back();  //尾删
	L1.pop_front();  //头删
	printL(L1);  //2 3 4 5 6 7 8
	
	L1.insert(L1.begin() , 1);
	printL(L1);  //1 2 3 4 5 6 7 8 
	
	L1.insert(L1.begin() , 3 , 0);
	printL(L1);  //0 0 0 1 2 3 4 5 6 7 80
	
	list<int>L;
	L.assign(3 , 9);
	L1.insert(L1.end() , L.begin() , L.end());
	printL(L1);  //0 0 0 1 2 3 4 5 6 7 8 9 9 9
	
	L1.erase(L1.begin());
	printL(L1);  //0 0 1 2 3 4 5 6 7 8 9 9 9

	L1.remove(0);
	printL(L1);  //1 2 3 4 5 6 7 8 9 9 9
	
	//清空
//	L1.erase(L1.begin() , L1.end());
	L1.clear();	
	printL(L1);
}

int main(){
	
	test();
	return 0;
}

六、list数据存取

函数原型:

  • front();  //返回第一个元素
  • back();  //返回最后一个元素

代码示例 

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

void test(){
	list<int>L;
	L.push_back(1);
	L.push_back(2);
	L.push_back(3);
	
	cout<<"第一个元素为:"<<L.front()<<endl;
	cout<<"最后一个元素为:"<<L.back()<<endl;
	
	list<int>::iterator it = L.begin();
	it++;//支持双向
	it--;
	
//	it = it + 1;//不支持随机访问
}

int main(){
	test();
	return 0;
}

七、list反转和排序

函数原型:

  • reverse();  //反转链表
  • sort();  //链表排序

所有不支持随机访问迭代器的容器,不可以用标准算法

不支持随机访问迭代器的容器,内部回提供对应一些算法

代码示例 

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

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

void test1(){
	list<int>L1;
	L1.push_back(1);
	L1.push_back(2);
	L1.push_back(3);
	L1.push_back(4);
	cout<<"反转前:"<<endl;
	printL(L1);
	
	cout<<"反转后:"<<endl;
	L1.reverse();
	printL(L1);
}

bool mySort(int val1 , int val2){
	return val1 > val2;
}

void test2(){
	list<int>L2;
	L2.push_back(3);
	L2.push_back(1);
	L2.push_back(5);
	L2.push_back(2);
	L2.push_back(4);
	cout<<"排序前:"<<endl;
	printL(L2);
	
	cout<<"排序后:"<<endl;
	L2.sort();//升序
	printL(L2);
	
	L2.sort(mySort);//降序
	printL(L2);
	
}

int main(){
	test1();//反转
	test2();//排序
	return 0;
}


http://www.kler.cn/a/451528.html

相关文章:

  • week 11 - BCNF
  • 《战神:诸神黄昏》游戏运行时提示找不到gamede.dll文件怎么办?gamede.dll丢失的修复指南
  • STM32-笔记11-手写带操作系统的延时函数
  • 深度学习之超分辨率算法——FRCNN
  • 单片机:实现数码管动态显示(0~99999999)74hc138驱动(附带源码)
  • 无人设备遥控器之定向天线篇
  • 无人机搭载rtk技术详解!
  • leetcode hot100 二叉树的最大深度
  • 数据结构之线性表之顺序表
  • 《智驱新材合成:AI 点亮创新路径之光》
  • upload-labs通关记录1
  • 图片和媒体资源的优化:提升Web应用性能与用户体验的关键
  • 生活家居的选择:打造温馨舒适的小窝
  • 科技快讯 | 刘强东提前发年终奖;理想超充站超时占用费试运营;美团听障骑手助手全量上线;微信视频号评论区可以斗图了
  • 关于日期的方法们
  • 频谱分析仪的关键性能指标有哪些?
  • 生成签名文件 .keystore
  • wfb-ng 开源代码之libsodium应用
  • 自动控制系统综合与LabVIEW实现
  • WebAPI编程(第一天,第二天)
  • 科普时刻 | 借助鲁棒性设计解决制造中的不确定性问题
  • 【论文笔记】Cross-lingual few-shot sign language recognition
  • 【深度学习基础之多尺度特征提取】不同尺寸卷积核、不同步长卷积是如何在深度学习网络中提取多尺度特征的?附代码
  • docker 容器的基本使用
  • 鸿蒙Next API 12开发,使用@ohos/axios进行HTTP请求
  • 【电路笔记】-布尔代数真值表