STL之Deque的使用方法

STL 中类 stack 实现了一个栈

1)push 能够插入元素

2)pop 移除栈顶元素

使用的时候,需要包含头文件 #include <stack>,stack 被声明如下:

namespace std
{
    template <class T, class Container = deque<T> >
    class stack;
}

第一个模板参数表示元素的类型,第二个模板参数表明了实现堆栈所使用的容器,即内部用于存储元素的容器,默认使用 deque,你可以使用任何的顺序容器,甚至于自己提供的顺序容器,只要含有 back(), push_back(), pop_back() 方法即可

定义一个栈:

std::stack<int> st;

std::stack<int, std::vector<int> > st2; // 使用 vector 做容器保存元素

这里提及一下 deque,对于 deque,元素被移除的时候,释放内存,而且在重新分配内存(realloc)的时候,不会拷贝元素,这是与 vector 不同的地方

1. 核心接口

栈少不了的三个核心接口:

1)void push() 插入元素到栈顶

2)void pop() 移除栈顶元素(注意,函数类型为 void)

3)value_type& top() 返回栈顶元素,并不会移除这个元素(注意,返回的是栈顶元素的引用),看下面的代码:

std::stack<int> st;
    st.push(1);
    st.top() = 2;   // 可以方便的修改栈顶元素
    std::cout << st.top() << "\n";   // 输出 2

注意在 STL 中,在栈为空时,top 和 pop 是未定义的,对于检查栈的大小,可以使用 empty 函数或者 size 函数

empty --- 如果栈为空,返回 true,否则返回 false

size --- 栈的大小

对于栈来说,几乎(不是全部)就是上面介绍的几个函数了

2. 类型

1)std::stack::value_type 元素的类型,等同于实现栈的顺序容器的类型,例如默认情况下,std::stack::value_type 等同于 std::deque::value_type

2)std::stack::size_type 无符号的整数类型,用于定义 stack 的大小

3)std::stack::container_type 容器类型

3. 函数补充

构造函数:

explicit stack::stack(const Container& cont);

比较操作符:

包括 ==, <=, >=, !=, <, >

两个栈相等的含义是,栈中元素数目,以及对应位置的元素相等

deque: 是一个double-ended queue,
    1)支持随即存取,也就是[]操作符,
    2)支持两端操作,push(pop)-back(front),在两端操作上与list效率差不多

因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则: 
    1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector 
    2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list 
    3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

时间: 2024-11-05 18:53:21

STL之Deque的使用方法的相关文章

带你深入理解STL之Deque容器

在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点.vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操作符,节省空间.但是其在分配的内存不够的情况下,需要对容器整体进行重新分配.拷贝和释放等操作,而且在vector中间插入或删除元素效率很低. 而list是以节点形式来存放数据,使用的是非连续的内存空间来存放数据,因此,在其内部插入和删除元素的时间复杂度都是O(1),但是其不支持随机访问和存取,不支持

STL vector中的rbegin方法(5)

public member function <vector> std::vector::rbegin C++98 C++11 reverse_iterator rbegin() noexcept; const_reverse_iterator rbegin() const noexcept; Return reverse iterator to reverse beginning 返回一个反向的首元素. 例子: #include <iostream> #include <v

STL中deque,queue,stack,list的学习

(一):要点 1:容器deque的使用方法 2:容器queue,stack的使用方法 3:容器list的使用方法 (二)deque 1:deque简介 deque是"double-ended queue"的缩写,deque是双端的,vector是单端的. deque在接口上和vector相似,在许多操作的地方可以直接替换 deque可以随机存取元素,支持索引值直接存取,使用[]或者是at()方法 deque的头部和尾部添加和移除元素都非常快速,但是在中部插入元素或移除元素 比较费时.

STL vector中的front方法(4)

public member function <vector> std::vector::front reference front(); const_reference front() const; Access first element 访问第一个元素 Returns a reference to the first element in the vector. 返回第一个元素的引用. Unlike member vector::begin, which returns an itera

【STL】vector的insert方法详解

#include<vector> #include<iostream> using namespace std; int main() { vector<int> v(3); v[0]=2; v[1]=7; v[2]=9; v.insert(v.begin(),8);//在最前面插入新元素. v.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素 v.insert(v.end(),3);//在向量末尾追加新元素. vector<int

STL vector中的crbegin方法(7)

其实crbegin就相当于cbegin+rbegin. 关于这两个函数可以看我的上两篇博文. public member function <vector> std::vector::crbegin const_reverse_iterator crbegin() const noexcept; Return const_reverse_iterator to reverse beginning Returns a const_reverse_iterator pointing to the

STL之deque容器的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector底层采用的是一个数组来实现,list底层采用的是一个环形的双向链表实现,而deque则采用的是两者相结合,所谓结合,并不是两种数据结构的结合,而是某些性能上的结合.我们知道,vector支持随机访问,而list支持常量时间的删除,deque支持的是随机访问以及首尾元素的删除. deque是double ended queue的缩写,读作deck.首先我们用一个图来说明deque底层所采用的数据结构. 这个数据结构有一种似曾相识的感觉

STL中的set使用方法详细!!!!

1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.查找等.让用户在STL使用过程中,并不会感到陌生. 关于set,必须说明的是set关联式容器.set作为一个容器也是

STL学习——Deque篇

STL学习--Deque篇 deque概述 deque是一种双向开口的连续线性空间.双向开口指可以在头尾两端分别做元素的插入和删除操作.虽然vector也可以在头尾两端进行操作,但是其头部操作效率极差,无法被接受. deque与vector最大差异:1)deque允许于常数时间内对起头端进行元素的插入或移除操作:2)deque没有所谓的容量概念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并连接起来.deque不提供所谓的空间保留功能,不存在重新配置,移动数据,释放原空间操作.