zoukankan      html  css  js  c++  java
  • 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() << " ";   // 输出 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。

  • 相关阅读:
    Android:JNI与NDK(一)
    okio:定义简短高效
    hashCode()方法以及集合中Set的一些总结
    Gradle入门到实战(二) — ImageOptimization安卓图片转换压缩插件
    Gradle入门到实战(一) — 全面了解Gradle
    数据结构与算法(十二):八大经典排序算法再回顾
    数据结构与算法(十一):图的基础以及遍历代码实现
    数据结构与算法(十):红黑树与TreeMap详细解析
    数据结构与算法(九):AVL树详细讲解
    Android版数据结构与算法(八):二叉排序树
  • 原文地址:https://www.cnblogs.com/seer/p/4080858.html
Copyright © 2011-2022 走看看