//顺序容器 顺序容器元素的排列次序与元素的值无关,而是 由元素添加到容器里的次序决定
1.vector (向量)
#include<vector>
vector<T> v;
(1)可以事先定义好大小,当不够用了,也可以用 v.resize(size)来重新分配空间,然后把原来的数据复制到 新分配的内存里面 ,然释放原来的内存空间,任何改变 vector 长度的操作都会使已经存在的迭代器失效,虽然vector比数组更灵活,可以随意扩展空间,但是重新分配空间会花费很多时间
(2)vector使用的是数组,即存储空间是一段连续的内存空间,是顺序存储结构
(3)vector可以事先定义一个固定的大小,比如vector<int> A(10) ,也可以使用push_back()的方法,从尾部扩张元素,或者 使用 insert ()在某个位置前面插入元素
(4)操作函数
v.push_back(t), v.size(), v.empty(), v[n], v1=v2, v1==v2, !,=,<,<=,>,>=
(5)支持随机访问 v[0]
2.deque(双端队列)
#include <deque>
deque<T> d;
(1)deque使用的是链表,内存空间不连续 ,但能够有效利用内存
(2)deque叫 双端队列,也就是可以在收尾进行操作,而vector只能在末尾进行操作,只在末未插入数据的话,vector的效率更高,而在其他地方插入数据的话,deque的效率会更高
(3)操作函数
d.push_back(), d.push_front(), d.insert(d.begin()+num,element), d.insert(d.end()-num,element){该函数在只是在num这个 位置插入了一个,对应该位置的原来的元素对应的后移} , d.pop_back(), d.pop_front()
(4)支持随机访问 ,d[0]
3.list(列表 )
#include<list>
list<T> l;
list<T>::iterator iter;定义 list的迭代器
(1)有两个指针域 ,可以向前访问,也可以向后访问,但是不能随机访问
for(iter=l.begin();iter!=l.end();iter++)
cout<<"元素"<<*iter<<endl;
(2)list主要用于存放双向列表,可以从任意一端开始遍历
(3)操作函数跟vector一样
l.erase(l.begin())
(4)list的操作都是利用iterator来进行操作的
int main()
{
list<int> l;
list<int>::iterator iter;
l.push_back(1);
l.push_back(2);
l.push_back(3);
for(iter=l.begin();iter!=l.end();iter++)
cout<<*iter<<" ";
cout<<endl;
l.insert(iter,4);
cout<<*iter<<endl;
l.erase(iter);
return0;
}
//关联容器 ,关联容器 是通过键值的存取和读取元素的数据的集合。关联容器读取和存取元素与写入的顺序无关,只根据键值来指定相应的元素
4.set(集合)
//顺序容器
#include<set>
set<T> set1;
(1)set中 所包含的元素 是唯一的,并按一定的顺序排列,一个集合用链表来组织,在插入和删除操作上比向量(vector)快,但查找和添加末尾元素的时候有些慢
(2)集和多集的区别 :集支持唯一值,集中的值都是特定的,而且只出现一次;而多集 中可以出现副本,同一 值可以重复多次出现
(3)当元素 放入 容器时会按照一定的顺序 自动排序,默认是按照less<>排序规则来排序的。这种自动排序的 特性加速了元素查找的过程,但也带来了一个问题,不可以直接修改集或是多集容器 中元素的值,因为这样违反了元素自动排序的规则,如果想要修改一个元素的值,必须先删除原有的元素,再插入新的元素
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> set1;
set<int>::iterator iter;
for(int i=0;i<10;i++)
set1.insert(i);//直接插入元素,无需往某个位置插入元素
for(iter=set1.begin();iter!=set1.end();iter++)
cout<<*iter<<" ";
cout<<endl;
if(set1.insert(1).second)//insert返回偏弱类型的对象,第一个为迭代器,迭代器指向拥有该键的元素,第二个为bool值,表明是否成功添加了元素,成功返回1,否则 返回0
cout<<"successful!"<<endl;
else cout<<"failed!"<<endl;
int a[]={4,1,1,1,1,1,0,5,0,1};
multiset<int> A;
A.insert(a,a+10);
for(multiset<int>::iterator p=A.begin();p!=A.end();p++)
cout<<*p<<" ";
cout<<endl;
return 0;
}
5.map(映射) multimap(多重映射)[key]=value
#include <map>
(1)映射和多重映射 基于某一类型Key的键值的 存在,提供对T类型数据的 高效检索,map不支持副本键,multimap支持副本键
(2)键本身是不能被修改的,除非删除
(4)同样是 利用 迭代子来进行迭代,获取每个元素
#include <iostream>
#include <map>
using namespacestd;
int main()
{
map<char,int,less<char>>map1;
map<char,int,less<char>>::iterator MapIter;//char是键的类型,int是值的类型
map1['a']=1;
map1['b']=2;
map1['c']=3;
map1['d']=4;
for(MapIter=map1.begin();MapIter!=map1.end();MapIter++)
cout<<(*MapIter).first<<":"<<(*MapIter).second<<endl;//first对应的char值,second对应的int值
map<char,int,less<char>>::const_iterator ptr;//定义了map类型的静态迭代器
ptr=map1.find('d');
cout<<'\n'<<(*ptr).first<<"键对应于值: "<<(*ptr).second;
return0;
}
//容器适配器 queue,priorit_queue,stack 适配器 是使一类事物的行为类似于另一类事物的行为的一种机制,容器适配器让一种已经存在的容器类型采用另一种不同的抽象类型的工作方式实线。容器适配器是 用来扩展7种基本容器的
6.stack(栈)
#include<stack>
stack<T>s;
(1)堆栈能够利用 任何序列容器实现:vector,list,deque
(2)主要操作
s.push(x) 压栈
s.pop()出栈
s.top() 获取栈 顶元素
s.empty() 判断栈是否为空 ,为空的话返回1,不为空 返回0
s.size() 返回栈中元素的个数
7.queue(队列)
#include <queue>
queue<T> q;
(1)队列允许在 底层数据结构的末尾插入元素,也允许 从前插入元素,队列能够用STL 数据结构的list和deque实现,默认情况下使用deque实现的
(2)主要操作
q.push(x) : 将元素压入队列
q.pop() 弹出首部元素
q.front() 获取首部元素
q.back() 获取尾部元素
q.empty() 判断队列是否为空,空的话返回1,否则返回0
q.size() 返回队列中元素的个数
8.priority_queue 优先级队列
#include <queue>
priority_queue<T> p;
(1)优先级队列能够用STL的序列容器vector和deque实现,默认情况下使用vector作为底层容器。当元素添加到priority_queue时,它们按优先级顺序插入
(2)主要操作
p.push(x) 将元素压入队列
p.pop() 弹出首部元素
p.top() 获取首部元素
p.empty() 判断队列是否为空,空的话返回1,不为空返回 0
p.size() 返回队列中元素的个数
(3)默认情况下,priority_queue采用vector作为实现容器,并将元素按照从大的到小降序排列