Deque 容器

deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容。deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。

构造函数:
  

    deque<Elem> c 创建一个空的deque
  deque<Elem> c1(c2) 复制一个deque。
  deque<Elem> c(n) 创建一个deque,含有n个数据,数据均已缺省构造产生。
  deque<Elem> c(n, elem) 创建一个含有n个elem拷贝的deque。
  deque<Elem> c(beg,end) 创建一个以[beg;end)区间的deque。
  ~deque<Elem>() 销毁所有数据,释放内存。

函数:


c.begin();
c.end();

c.rbegin();
c.rend();

c.assign(n,num);//将n个num拷贝复制到容器c
c.assign(beg,end);//将[beg,end)区间的数据拷贝复制到容器c

c.at(pos);//返回索引为pos的位置的元素,会执行边界检查,如果越界抛出out_of_range异常

c.operator[];//下标运算符重载

c.empty();

c.front();//返回c容器的第一个元素
c.back();//返回c容器的最后一个元素

c.size();//返回c容器中实际拥有的元素个数

c.clear();//清除c容器中拥有的所有元素

c.insert(pos,num);//在pos位置插入元素num
c.insert(pos,n,num);//在pos位置插入n个元素num
c.insert(pos,beg,end);//在pos位置插入区间为[beg,end)的元素

c.erase(pos);//删除pos位置的元素
c.erase(beg,end);//删除区间为[beg,end)的元素

c.push_back(num);//在末尾位置插入元素
c.pop_back();//删除末尾位置的元素
c.push_front(num);//在开头位置插入元素
c.pop_front();//删除开头位置的元素

deque的优势是从两端快速添加删除,只要不是在中间添加删除,其迭代器都是有效的.

在两端添加删除的效率,可以理解为常熟时间,效率要比vector和list好很多.

因为内部实现是按block来的,vector是一整快,list是没个节点都是一块.vector发生扩容,有可能需要全部拷贝一次,deque里面不会发生这种情况.


deque的应用非常广泛,很多模拟都会用到

还有可以用deque代替数组进行维护单调栈,多少时间并不会多出

下面代码是用单调栈来得出每一个位置的下一个比这个位置上元素大的元素的位置


D read(){ D ans=0; char last=' ',ch=getchar();
while(ch<'0' || ch>'9')last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans; return ans;
}

int a[20000],nex[20000];//the idx of next bigger number
int main(){
    int n=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
    }
    deque<int>q;
    for(int i=n;i>=1;i--){
        while(!q.empty()&& a[q.front()]<=a[i])q.pop_front();
        if(q.empty())q.push_front(i),nex[i]=-1;
        else nex[i]=q.front(),q.push_front(i);
    }
    for(int i=1;i<=n;i++){
        printf("%d:%d\n",i,nex[i]);
    }
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/81321409
今日推荐