STL:顺序容器

前言

本文整理了一些STL中顺序容器的用法和特性。
顺序容器主要包括:vector、list、deque,以及deque的延伸stack、queue

Vector

vector的存储空间与普通数组相同,是连续的。它拥有三种容器中最快的访问速度,同理插入和删除是三种容器中最慢的,以下给出一些基本操作。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> a2[100];//申明一个二维的vector容器 
	vector<int> a1(40,9);//初始化40个值为9的元素
	
	a1.push_back(1);//添加元素
	a1.pop_back();//删除末尾元素 
	bool flag=a1.empty();//判断是否有元素 
	int length1=a1.size();//获取a1的长度
	int length2=a2[1].size();//获取a2某一行的长度
	int k=a1[3];//元素引用。二维引用同二维数组,如a2[1][1]
	a1.insert(a1.begin()+1,10,7);//从a1[1]开始插入10个7
	a1.erase(a1.begin(),a1.begin()+11);//删除从a1[1]到a1[11]之间的元素,注意与前者的区别 
	a2[1].clear();//清除元素
	
	for(int i=0;i<a1.size();++i)//元素的遍历(下标) 
		cout<<a1[i]<<" "; 
	
	vector<int>::iterator it=a1.begin();//元素的遍历(迭代器) 
	while(it!=a1.end())
	{
		cout<<*it<<" ";
		++it;
	}
	return 0;	
}

优点:
1.相当于不指定大小的数组,可以方便的存储在连续的空间内。
2.运用下标,随机访问速度快,同数组。
3.基于连续空间存储,总体节省空间。
缺点:
1.在vector中间插入和删除元素很慢。
2.当数据大小超过vector默认的大小时,用重新分配内存。
在图论中,vector可以用于存储节点之间的连接关系。



List

list的存储空间是不连续的,基于链表实现。相较于Vector,在list中间插入或删除元素很快,但随即访问list中的元素则较慢,只能用迭代器遍历。

#include<iostream>
#include<list>
using namespace std;
int main()
{
	list<int> a1(40,9);//初始化40个元素都为9的list
	
	a1.push_back(8);//在尾部添加元素
	a1.pop_back();//剔除尾部元素
	a1.push_front(8);//在头部添加元素
	a1.pop_front();//删除头部元素 
	bool flag=a1.empty();//判断是否为空
	int length=a1.size();//获取list的长度
	
	a1.reverse();//反转
	a1.sort();//排序
	a1.insert(a1.begin(),3,4);//从a1[0]插入3个4 
	a1.unique();//删除相邻的重复元素
	a1.remove(8);//删除相同元素
	
	a1.front();//返回第一个元素
	a1.back();//返回最后一个元素
	
	list<int>::const_iterator it=a1.begin();//用迭代器遍历 
	while(it!=a1.end())
	{
		cout<<*it<<" ";
		++it;
	}
	return 0; 
}

优点:
1.最快的插入和删除元素的速度。
2.存储空间不连续,更灵活。
缺点:
1.随机访问元素过慢。
2.用链表实现,空间开销较大。
slist是list的延伸,结构上是单向链表,只能在头部添加元素。



Deque

deque的存储结构由两部分构成,连续的空间和各连续空间之间的联系,可以看做vector和list的结合,deque处理随机访问和插入删除元素的表现都介于vector和list之间,占用内存也介于两者之间。


Stack

stack容器基于deque,实现栈的用法,其中元素的添加删除符合“后进先出原则”。
stack容器中的常用函数:
1.在栈顶添加元素:push();
2.移除栈顶元素:pop();
3.返回栈顶元素:top();
4.返回栈的元素个数:size();
5.判断是否为空栈:empty();
代码演示:

#include<iostream>
#include<stack>
using namespace std;
int main()
{
	stack<int> s;
	s.push(10);//在栈顶添加元素10
	s.push(11);
	s.push(12);
	s.push(13);
	s.pop();//移除栈顶元素 
	int k=s.top();//返回栈顶元素
	int length=s.size();//返回元素个数
	bool flag=s.empty();//判断是否有元素
	
	while(!s.empty())//出栈演示 
	{
		cout<<s.top()<<" ";
		s.pop();
	} 
	return 0; 
}

Queue

queue容器基于dqueue,实现单向队列的用法,元素的添加和删除符合“先进先出”原则。
queue中常用的函数:
1.末端添加元素:push();
2.删除头部元素:pop();
3.返回末端元素:back():
4.返回头部元素:front();
5.返回队列长度:size();
6.判断是否为空:empty();
代码演示:

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	queue<int> q;
	q.push(10);//添加元素 
	q.push(11);
	q.push(12);
	q.push(13);
	q.pop();//移除头部元素
	int k1=q.front();//返回头部元素
	int k2=q.back();//返回末端元素
	int length=q.size();//获取队列中元素的个数
	bool flag=q.empty();//判断队列中是否有元素 
	
	while(!q.empty())//出队列演示
	{
		cout<<q.front()<<" ";
		q.pop();
	}
	return 0; 
}

Priority_queue

priority_queue包含在queue头文件中,它与queue的区别是,能对添加的元素进行自动排序,每添加一个元素就会把它插入在队列中合适的位置,是队列顺序。移除的元素为最大的元素(默认),可以通过定义结构体变量进行其他方式的排序。

猜你喜欢

转载自blog.csdn.net/weixin_43843835/article/details/86744249
今日推荐