C++ STL(容器:deque&stack&queue&map/multimap)

目录

0deque容器

包含头文件

1deque常用API

2stack容器

3queue队列

4map/multimap容器

常用API


0deque容器

双向开口的连续线性空间,可以在队首和尾部进行快速的插入和弹出操作,区别于vector容器,deque的头插,效率非常高,而vector头插效率极低。

deque允许在固定的步骤内,在头部进行元素的插入和删除,效率很高;

deque和vector的区别:

  1. deque没有容量的概念,它是动态的以分段连续空间组合而成的,随时可以增加一段新的空间
  2. 并链接起来,像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);//向栈顶添加元素
pop();//从栈顶移除第一个元素
top();//返回栈顶元素

empty();//判断是否为空
size();//返回栈大小

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元素的迭代器
 
    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";
    }

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

猜你喜欢

转载自blog.csdn.net/qq_41605114/article/details/105023835
今日推荐