C++STL模板类vector、list


STL(Standard Template Library)是C++的标准模板库,竞赛中很多常用的数据结构、算法在STL中都有,熟练地掌握它们在很多题目中能极大地简化编程。

vector

vector容器是一个模板类,能存放任何类型的对象。

vector:动态数组,从末尾能快速插入与删除,直接访问任何元素

一、定义

  1. 定义int型数组(也可使char、double等类型)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector< int >a;//默认初始化,a为空
	vector< int >b(a);//用a定义b
	vector< int >a(100);//a有100个值为0的元素
	vector< int >a(100,6);//a有100个值为6的元素
	
}
  1. 定义string型数组
#include<iostream>
#include<vector>
using namespace std;
int main()
{

	vector< string >a(10,"null");//10个值为null的元素;
 	vector< string >vec(10,"hello");//10个值为hello的元素
 	vector< string >b(a.begin(),a.end());//b是a的复制
}
  1. 定义结构型数组
#include<iostream>
#include<vector>
using namespace std;
struct point{
	int x,y;
};
int main()
{
	vector< point >a;//a用来存坐标
}
  1. 定义二维数组
	vector<int>a[5];

它的一维大小是固定的,第二维是动态的,也可定义多维数组

简单应用:

#include<bits/stdc++.h>
#include<vector>//可不写
using namespace std;
int main()
{
 	vector<int>a[10];
 	for(int i=0;i<5;i++)
 	{
  		for(int j=0;j<4;j++)
 		{
   			a[i].push_back(5);
  		}
 	} 
 	for(int i=0;i<5;i++)
	{
  		for(int j=0;j<4;j++)
  		{
   			cout<<a[i][j]<<" ";
  		}
 		cout<<endl;
 	}
}

在这里插入图片描述

二、常用操作

  1. 赋值:在尾部添加元素
	a.push_back(1);
  1. 元素个数
	int size;
	size=a.size();
	cout<<size;
  1. 判断是否为空
	bool isEmpty;
	isEmpty=a.empty();
	cout<<isEmpty;//若为空返回1,否则返回0
  1. 打印第一个元素
cout<<a[0]<<endl;
  1. 中间插入:在第i个元素前面插入k
	
	a.insert(a.begin()+i,k);
  1. 尾部插入

插入单个元素

	 a.push_back(100);

插入多个元素

 	a.push_back(105);
  1. 删除尾部
	a.pop_back();
  1. 删除区间:删除区间[ i , j-1 ]的元素
	a.erase(a.begin()+i,a.begin()+j);//删除的是第i到第j-1个元素
  1. 删除元素:删除第i+1个元素
	 a.erase(a.begin()+i);
  1. 调整大小:数组大小变为n
	a.resize(n);

  1. 排序:从小到大排(基于快排)
	sort(a.begin,a.end);
  1. 翻转数组
	reverse(a.begin,a.end);
  1. 清空
	a.clear();

三、代码实现

下面是与上面对应得代码实现结果和详细代码:
在这里插入图片描述

#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
   
  vector<int>a;
  a.push_back(100);
  a.push_back(101);
  a.push_back(102);

  cout<<"元素个数:"; 
  int size=a.size();
  cout<<size<<endl;
  
  cout<<"判断是否为空:";
  bool isEmpty=a.empty();
  cout<<isEmpty<<endl;
  
  cout<<"打印第一个元素:";
  cout<<a[0]<<endl;
  
  cout<<"中间插入:";
  a.insert(a.begin()+1,520);
  cout<<"在第1个元素前插入520,输出四个元素:"; 
  cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
  
  cout<<"尾部插入10个5"<<endl;
  a.insert(a.end(),10,5);
  cout<<"插入成功!"<<endl;
   
  cout<<"删除区间[0,1]的元素后前两个元素为:";
  a.erase(a.begin()+0,a.begin()+2);
  cout<<a[0]<<" "<<a[1]<<endl;
  
  cout<<"数组大小变为:";
  a.resize(20);
  cout<<a.size()<<endl;
  
  cout<<"将前5个元素排序:";
  sort(a.begin(),a.begin()+5);
  cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<" "<<a[4]<<endl;
  
  cout<<"将前五个元素翻转:";
  reverse(a.begin(),a.begin()+5); 
  cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<" "<<a[4]<<endl;
  
  cout<<"清空数组,大小变为:";
  a.clear();
  cout<<a.size(); 
}

下面是一个应用vector例题:
圆桌问题(约瑟夫环)


list

STL的list是数据结构的双向链表,它的内存空间可以不连续,通过指针来进行数据的访问,它可以高效的地在任意地方删除和插入

list和vector的优缺点正好相反,他们的应用场景不同。
(1)vector:插入和删除操作少,随机访问元素频繁
(2)list:插入和删除频繁,随机访问少。

list中的一些常用操作与vector和string中的基本操作相同,参考:标准C++String类
list中的其他常用操作:

push.back();
push.front();
pop.back();
pop.front();//在头、尾进行删除和插入
assign();//赋值,如list.assign(5,8),5个8
assign(begin,end);//将区间(左闭右开)赋值中数据拷贝赋值给本身,list.assign
sort();//假设用list.sort表示
reverse();//将链表元素颠倒,list.reverse
remove();//移除链表中元素,list.remove
swap();//交换两个链表中的元素,list1.swap(list2)
unique();//删除重复,list.unique表示
merge();//合并两个链表中的元素,list1.merge(list2)

发布了67 篇原创文章 · 获赞 216 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45895026/article/details/104087205