目录
0deque容器
双向开口的连续线性空间,可以在队首和尾部进行快速的插入和弹出操作,区别于vector容器,deque的头插,效率非常高,而vector头插效率极低。
deque允许在固定的步骤内,在头部进行元素的插入和删除,效率很高;
deque和vector的区别:
- deque没有容量的概念,它是动态的以分段连续空间组合而成的,随时可以增加一段新的空间
- 并链接起来,像vector那样,“旧空间不足,找新空间,赋值元素,再释放旧空间”的这种操作是不存在的,所以deque没有reserve
deque存储模式:
deque容器是由一段一段的定量的连续空间构成,一旦有必要在deque前段后者尾端增加新的空间,便会配置一段连续的定量空间,串联在deque的头端或者尾端,deque最大的工作就是维护这些分段连续的内存空间的整体性的假象,并提供随机存取的接口,避开了重新配置空间,复制,释放的轮回,代价就是复杂的迭代器架构。
包含头文件
using namespace std;
#include<deque>
1deque常用API
//deque<T>deqT;//默认构造函数
//deque(beg,end);//构造函数将【beg,end】区间中的元素拷贝给本身
//deque(n,elen);//构造函数将n个elen拷贝给本身
//deque(const deuqe & deq);//拷贝构造函数
//assign(beg,end);//将【beg,end】区间中的数据拷贝给本身
//assign(n,elen);//将n个elen拷贝赋值给本身
//deque & operator=(const deque & dep);//重载等号操作符
//swap(deq);//将deq与本身的元素互换
//deque.size();//返回容器中元素的个数
//deuqe.enpty();//判断容器是否为空
//deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充位置,变短,删除多余元素。
//deque.resize(num,elen);//重新指定容器的长度为num,若容器变长,则以elen填充位置,变短,删除多余元素。
//push_back(elen);//尾插
//push_front(elen);//头插
//pop_back();//尾部弹出
//pop_front();//头部弹出
//at(index);//访问index位置的元素
//operator[];//返回内容,越界直接报错
//front();//第一个元素
//back();//最后一个元素
//insert(pos,elen);//在pos位置插入elen元素
//insert(pos,n,elen);//在pos位置插入n个elen
//insert(pos,beg,end);//在pos位置插入beg到end直接的内容
//clear();//清除所有数据
//erase(beg,end);//删除beg到end之间的数据
//erase(pos);//删除pos位置的数据
//begin();//返回iterator,指向首元素
//end();//返回iterator,指向尾元素的后一个位置
//rbegin();//返回iterator,指向向尾元素
//rend();//返回iterator,指向首元素的前一个位置
示例:
void test_d()
{
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_back(40);
PrintDuque(d);
qDebug()<<"Part2";
deque<int>d2(d.begin(),d.end());
d2.pop_front();
d.swap(d2);
PrintDuque(d);
}
void PrintDuque(const deque<int> & d)
{
for(deque<int>::const_iterator dp = d.begin();dp!=d.end();dp++)
{
qDebug()<<*dp;
}
//指向可以修改,指向内容无法修改
}
此处使用了const迭代器:const迭代器是针对constdeque<000>d变量的。
反向迭代器:
void Reverse_PrintDuque(const deque<int> & d)
{
for(deque<int>::const_reverse_iterator rdp = d.rbegin();rdp!=d.rend();rdp++)
{
qDebug()<<*rdp;
}
//指向可以修改,指向内容无法修改
}
qDebug()<<"reserve:";
Reverse_PrintDuque(d);
输出:
2stack容器
栈,先进后出,stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以取stack的其他元素,只要pop和push,及入栈和出栈行为。
栈没有普遍意义上的遍历功能,所以stack是没有迭代器的。
头文件和名称空间
#include<stack>
using namespace std;
stack<DataType> stkI;//构造函数
stack(const stack & stk);拷贝构造函数
stack & operator=(const stack & stk);//重载等号操作符
push(elen);//向栈顶添加元素
void pop();//从栈顶移除第一个元素
DataType top();//返回栈顶元素
empty();//判断是否为空
size();//返回栈大小
典型的栈结构,push入栈,pop出栈,top是返回栈顶元素(也就是最后进入的元素)
vector就没有返回栈顶元素的功能。
3queue队列
先进先出,两个出口,先进先出,从队首入队,从队尾出队,pop和push之后元素就压入或者弹出了。
同样的,queue也没有迭代器,不提供遍历功能,
头文件和名称空间
#include<queue>
using namespace std;
queue<DataType> queT;//构造函数
queue(const queue & que);//拷贝构造函数
push(elen);//往队尾添加元素
pop();//从队头移除第一个元素
back();//返回最后一个元素
front();//返回第一个元素
queue operator=(const queue & que);//重载等号操作符
empty();//判断队列是否为空
size();//返回队列的大小
4map/multimap容器
Map的特征是,所有元素都会根据元素的键值自动排序,Map所有的元素都是pair,同时拥有实值和键值,pair的第一个元素被视为键值,第二个元素被视为实值,map不允许两个元素有相同的键值。
Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,除了被删除的那个元素的迭代器。
Map和Multimap操作相似,都是以红黑树为底层实现机制。
包含头文件和名称空间
#include<map>
using namespace std;
常用API
map<T1,T2>mapTT;//构造函数
map(const map & mp);//拷贝构造函数
map & operator=(const map & mp);//重载等号运算符
swap(mp);//交换
size();//大小
empty();//是否为空
map.insert()系列//插入方式
map<int,string>mapStu;
mapStu.insert(pair<int,string>(3,"123"));
mapStu.insert(make_pair(3,"123"));
mapStu.insert(map<int,string>::value_type(3,"123"));
mapStu[key] = value;
clear();//删除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end);//删除区间[beg,end]的所有元素,返回下一个元素的迭代器
erase(keyElen);//删除容器中key为keyElen的对组
find(key);//查找key是否存在,存在返回迭代器,不存在,返回map.end()
count(keyElen);//返回容器中key为KeyElen的对组个数。对map来说,要么是0,要么是1.对multimap来说,可能dayv1
lower_bound(KeyElen);//返回第一个key>keyelen元素的迭代器
upper_bound(KeyElen);//返回第一个key<keyelen元素的迭代器
equal_bound(KeyElen);//返回第一个key==keyelen元素的迭代器
findAPI切记要注意:寻找的是key值是否存在,不是value值
qDebug()<<"删除第一项";
m.erase(1);
//遍历
for(map<int,int>::iterator it = m.begin();it!=m.end();it++)
{
qDebug()<<"result = "<<*it;
}
map<int,int>::iterator ip = m.find(3);
qDebug()<<"删除最后一项";
map<int,int>::iterator returnResult = m.erase(ip);
qDebug()<<"被删除的下一个result = "<<*returnResult;
//遍历
for(map<int,int>::iterator it = m.begin();it!=m.end();it++)
{
try
{
qDebug()<<"result = "<<*it;
}
catch(exception e)
{
qDebug()<<"something"<<e.what();
}
}
map<int,int>::iterator position = m.find(4);
if(position != m.end())
{
qDebug()<<*position;
}
else
{
qDebug()<<"No Data";
}
map和unordered_map的差别和使用:https://blog.csdn.net/BillCYJ/article/details/78985895