【 C++ 】常用容器用法总结

一、容器

概念:容器是存储其他对象的对象。被存储的对象必须是同类型。

基本特征:以下用X表示容器类型,T表示储存的对象类型(如int);a和b表示为类型X的值;u表示为一个X容器的标识符(如果X表示vector<int>,则u是一个vector<int>对象。)

表达式返回类型说明复杂度
X::iterator指向T的迭代器类型满足正向迭代器要求的任何迭代器编译时间
X u 创建一个名为 u 的空容器固定
X () 创建一个匿名的空容器固定
X u(a) 创建一个名为u,值为a的容器线性
a.begin()迭代器返回指向容器第一个元素的迭代器固定
a.end()迭代器返回指向容器最后一个元素+1的迭代器固定
a.size()无符号整型返回元素个数固定
a.swap()void交换a和b内容固定
a == b可转换为bool如果a和b长度相当且每个元素都相等,则为真线性
a != b可转换为bool返回 !(a == b)线性

二、序列容器

常用容器:vector、list、deque、queue、stack

概念:序列是对基本容器的一种改进,在保持其基础功能上增加一些我们需要的更为方便的功能。

要求:序列的元素必须是严格的线性顺序排序。因此序列中的元素具有确定的顺序,可以执行将值插入到特定位置、删除特定区间等操作。

序列容器基本特征:以下用 t 表示类型为T(储存在容器中的值的类型)的值,n表示整数,p、q、i和j表示迭代器。

表达式返回类型说明
X a(n,t) 声明一个名为a的由n个t值组成的序列
X(n,t) 创建一个由n个t值组成的匿名序列
X a(i,j) 声明一个名为a的序列,并将其初始化为区间[i,j)的内容
X (i,j) 创建一个匿名序列,并将其初始化为区间[i,j)的内容
a.insert(p,t)迭代器将t插入到p的前面
a.insert(p,n,t)void将n个t插入到p的前面
a.insert(p,i,j)void将区间[i,j)的元素插入到p前面
a.erase(p)迭代器删除p所指向的元素
a.erase(p,q)迭代器删除区间[p,q)中的元素
a.clear()void清空容器

不同容器特有的特征:

表达式支持的容器
a.front()vector、list、deque
a.back()vector、list、deque
a.push_front(t)list、deque
a.push_back(t)vector、list、deque
a.pop_front(t)list、deque
a.pop_back(t)vector、list、deque
a[n]vector、deque
a.at(t)vector、deque

注:a[n]和a.at(n)都返回一个指向容器中第n个元素的引用。区别在于:如果n落在容器有效区间之外,a.at(n)将执行边界检查,并引发out_of_range异常。

之所以vector没有push_front(),是因为vector执行此表达式复杂度为线性时间,而deque为固定时间。(这与它们的特性有关。)

1、vector

  • vector是最简单也是最重要的一个容器。其头文件为<vector>。
  • vector是数组的一种类表示,它有以下优点:自动管理内存、动态改变长度并随着元素的增减而增大或缩小。
  •  在尾部添加元素是固定时间,在头部或中间添加或删除元素是线性时间。
  • vector是可反转容器。

 2、deque

  • 头文件<deque>
  • 在STL中deque类似vector,并且支持随机访问。区别在于:从deque起始位置插入删除元素时间是固定的。
  • 为了实现在deque俩端执行插入和删除操作的时间为固定这一目的,deque对象设计比vector设计更为复杂一些。因此,在序列中部执行插入删除操作时,vector更快一些

3、list 

  • list表示双向链表。头文件<list>
  • list为可反转容器。
  • list不支持数组表示法和随机访问。
  • 与矢量迭代器不同,从容器中插入或删除元素之后,链表迭代器指向的元素不变。这与链表的特性有关,删除链表中的元素并不改变其它元素位置,只是修改链接信息。(代码证明)
  • 不同于vector,list不强调随机访问与快速访问,list强调的是元素的快速插入与删除
  • 再次提醒:序列容器都是线性排序,因此list首尾不会相连。

list成员函数 

函数说明
void merge(list<T,Alloc>& x)将链表x与调用链表合并,俩个链表必须已排序。合并后的经过排序的链表保存在调用链表中,x为空。线性时间。
void remove(const T & val)从链表中删除val的所有实例。线性时间。
void sort()使用<运算符对链表进行排序,复杂度NlogN
void splice(iterator pos,list<T,Alloc>x)将链表x的类容插入到pos前面,x将为空。固定时间。
void unique()将连续相同的元素压缩为单个元素。线性时间。

代码

#include<iostream>
#include<list>
#include<iterator> 
#include<algorithm>
using namespace std;
 
void outint(int n){cout << n << " ";}
 
void Show(list<int> dice,int flag){
	if(flag)	cout<<"dice = ";
	else	cout<< " two = ";
	for_each(dice.begin(),dice.end(),outint);//输出容器的元素。 
	cout << endl;
}//此函数用来输出容器元素 
 
int main()
{
	list<int> dice(5,2);//一种赋初值方法。5个2 
	Show(dice,1);
	int a[] = {1,5,4,3};
	dice.insert(dice.begin(),a,a+4);//insert函数用法 
	Show(dice,1);
	list<int> two(dice);//另一种赋初值方法,其值与dice相等 
	Show(two,0);
	dice.splice(dice.begin(),two);//splice函数用法 
	Show(dice,1);
	Show(two,0); //two清空 
	two = dice;
	dice.unique();//unique压缩连续相同的元素
	Show(dice,1);
	dice.sort();//sort函数用法 
	two.sort(); 
	Show(dice,1);
	Show(two,0); 
	dice.merge(two);//merge函数用法,将two合并到dice中,two将为空。
	Show(dice,1);
	Show(two,0); 
	dice.remove(2);//移除所有2 
	Show(dice,1);
	return 0;
}

4、deque

  • 头文件<queue>
  • queue不允许随机访问队列元素,不允许遍历队列,可以进行队列基本操作
  • 可以将元素添加到队尾,从队首删除元素,查看队尾和队首的值,检查元素数目和测试队列是否为空

queue的操作: 

方法说明
bool empty()const如果队列为空,则返回true,否则返回false
size_type size()const返回队列中元素的数目
T& front() 返回指向队首元素的引用
T& back()返回指向队尾元素的引用
void push(const T& x) 在队尾插入x
void pop() 删除队首元素

注:pop()是一个删除数据的方法,不是检索数据的方法。如果要使用队列中的值,首先要使用front()来检索这个值,然后用pop()将他从队列中删除。

5、stack

  • 头文件<stack>
  • stack是一个适配器,它给底层类(默认vector)提供典型栈接口。
  • stack不允许随机访问栈元素,不允许遍历栈,把使用限制在定义栈的基本操作上
  • 可以将值压入栈顶,从栈顶弹出元素,查看栈顶的值,检查元素数目,测试栈是否为空

stack的操作

方 法说 明
bool empty()const如果栈为空,返回true,否则返回false
size_type size()const返回栈中元素数目
T& top()返回指向栈顶元素的引用
void push(const T& x)在栈顶插入x
void pop()删除栈顶元素

注:与queue类似,如果要使用栈中的值,必须首先使用top()来检索这个值,然后使用pop()将它从栈顶删除。

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值