STL标准库-容器-deque

摘要: 技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性。

deque双向开口可进可出的容器

我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去

deque却可以,它创造了内存连续的假象.

其实deque由一段一段构成 ,他是分段连续,而不是内存连续 当走向段的尾端时候自动跳到下一段 所以支持迭代器++ 操作,自动跳到下一段的方法由operator++实现

deque每次扩充 申请一个段

一 定义

头文件 #include <deque>

int main_0() {

    //默认构造函数 创建一个空的deque
    deque<int> c;

    //拷贝构造
    deque<int> c1(c);

    //赋值拷贝
    deque<int> c2 = c1;

    //指定元素个数创建
    deque<int> c3 (5,6);
    for (auto i : c3) {
        cout<< i << ",";
    }
    cout << "deque(个数, 元素)"<<endl;

    //指定区间创建
    deque<int> c4(c3.begin()+2, c3.begin()+3);
    for (auto i : c4) {
        cout<< i << ",";
    }
    cout << "deque(区间, 区间)"<<endl;

    //指定初始化列表创建
    deque<int> c5({2,3,4,5});
    for (auto i : c5) {
        cout<< i << ",";
    }
    cout << "deque({})"<<endl;

    //指定初始化列表创建
    deque<int> c6 = {2,3,4,5};
    for (auto i : c6) {
        cout<< i << ",";
    }
    cout << "deque = {}" <<endl;
    cout<<endl;
    return 0;
}


二 操作

int main()
{
    deque<int> c = {1,2,3,4,5};
    deque<int> c1;

    // 赋值初始化
    c1.assign(c.begin(),c.end());
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "assign()" <<endl;

    //在尾部插入
    c1.push_back(6);
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "push_back()" <<endl;

    //头插入
    c1.push_front(0);
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "push_front()" <<endl;

    //弹尾元素
    c1.pop_back();
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "pop_back()" <<endl;

    //弹头元素
    c1.pop_front();
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "pop_front()" <<endl;

    //指定位置插入元素
    c1.insert(c1.begin()+3, 10);
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "insert()" <<endl;

    //删除指定位置元素
    c1.erase(c1.begin()+3);
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "erase()" <<endl;

    //清空deque
    c.clear();
    for (auto i: c) {
        cout<< i << ",";
    }
    cout << "clear()" <<endl;

    //构造
    c1.emplace(c1.end(), 100);
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "emplace()" <<endl;

    //头位置插入元素
    c1.emplace_front(111);
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "emplace_front()" <<endl;

    //尾位置插入元素
    c1.emplace_back(111);
    for (auto i: c1) {
        cout<< i << ",";
    }
    cout << "emplace_back()" <<endl;

    //交换
    c.swap(c1);
    for (auto i: c) {
        cout<< i << ",";
    }
    cout << "swap()" <<endl;

    int tmp;
    tmp = c.front();
    cout<<"第一个元素"<< tmp << endl;

    tmp = c.back();
    cout<<"最后一个元素"<< tmp << endl;

    tmp = c.at(1);
    cout<<"指定下标元素"<< tmp << endl;

    tmp = c[1];
    cout<<"指定[]下标元素"<< tmp << endl;

    return 0;
}


三 内存

int main()
{
    deque<int> c = {1,2,3,4,5};

    //元素个数
    cout<< "size(): " << c.size() <<endl;

    //重新设定deque大小 少退多补
    c.resize(10, 5);
    for(auto i : c)
    {
        cout << i <<",";
    }
    cout << "resize()" << endl;

    //最大容量
    cout << "max_size(): " << c.max_size() <<endl;

    //是否为空
    cout << "empty: " << c.empty() << endl;

    //清空内存
    c.shrink_to_fit();

    return 0;
}


五 与迭代器操作

int main()
{
    deque<int> c = {1,2,3,4,5};
    //指向第一个元素的迭代器
    cout << *c.begin() << endl;
    //指向最后一个元素的下一个位置的迭代器
    cout << *c.end() << endl;
    //反向deque的第一个元素的迭代器
    cout << *c.rbegin() << endl;
    //反向deque的第一个元素的上一个位置迭代器
    cout << *c.rend() << endl;
    //指向第一个元素的迭代器
    cout << *c.cbegin() << endl;
    //指向最后一个元素的下一个位置的迭代器
    cout << *c.cend() << endl;
    //反向deque的第一个元素的迭代器
    cout << *c.crbegin() << endl;
    //反向deque的第一个元素的上一个位置迭代器
    cout << *c.crend() << endl;

    return 0;
}
时间: 2024-10-17 13:15:34

STL标准库-容器-deque的相关文章

STL标准库-容器-set与multiset

摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key set的key不能相同.multiset的key相同.关联容器的查找效率要高于顺序容器很多很多. set和multiset不提供用来直接存取元素的任何操作函数,取值需要通过迭代器 一 定义 1.set/mulitiset以红黑树为底层结构,因此有元素自动排序的特性,排序是根据key,而set.m

STL标准库-容器-list

摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历.在list 的任意位置插入和删除元素的效率都很高. 它的结构 一 定义 头文件 #include <vector> #include <iostream> #include <list> using namespace std; int main(int argc, const c

STL标准库-容器适配器

摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 上一节介绍了仿函数适配器,这节主要介绍容器适配器和迭代器适配器的概念,其实容器适配器和迭代器其适配器就是封装了一些其他class的方法,非常好理解. 如果你想让一个calss拥有另一个class的功能,你都可以这样做:1.继承 2.包含 迭代器适配器 运用继承方式,实现适配功能,其实现与仿函数适配器相似. 容器适配器中主要运用的就是包含,即一个类含的一个成员变量是另一个类,本节简单介绍两个容器适配器 容器适配器 qu

STL标准库-容器-rb_tree

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 红黑树,关联式容器底层实现(map set),在使用中基本运用不到,但是还是想了解一下他的运作方式 Red_Black tree是平衡二分搜寻树(balanced binary search tree),它是高度平衡的二叉树,这样有利于search和insert. 红黑树提供遍历,如果如果按正常规则(++iter)遍历,便能获得排序状态 如上图,你会发现返回迭代器头的begin()函数指向的是"5"

STL标准库-容器-vector

摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 我对向量容器vector的理解就是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector< 类型 > 标识符(最大容量,初始所有值) vector是一种类模板,那么他有很多行为与类相似 头文件 #include <vector> //a.定义 vector<typeName> v; vector<int> v; //b.拷贝构造

STL标准库-容器-map和multimap

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此map仍然具有自动排序的功能 我们无法使用迭代器改变元素的key(const key),但是可以改变元素的data. map的key必须独一无二,multimap的key可以重复 map的定义函数 template <typename _Key, typename _Tp, typena

C++ Primer 学习笔记_45_模板(三):缺省模板参数(借助标准模板容器deque实现Stack模板)、成员模板、关键字typename

一.缺省模板参数 1.stack内存能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: template <typename T, typename CONT = std::deque<T> > //此处末尾必须有空格,否则编译出错 class Stack { - private: CONT c_; }; 如果没有传第二个参数,默认为deque 双端队列,当然我们也可以传递std::vector<T> 2.示例:借助

STL标准库-算法-常用算法

摘要: 摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each() for一段区间 做你指定的行为 3.replace(), replace_if(), replace_copy() 替换函数 4.count(), count_if() 计数 5.find() 查找 6.sort() 排序 7.binary_search()查看元素是否在

参考C++STL标准库中对了的使用方法

http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 参考:http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 当然是使用c++中的STL 的queue啦.下面简要介绍一下使用方法. 1 准备工作 头文件 #include<queue> 2 声明和定义的方法.STL的队列是泛型模板,支持任何内置和构造类型. 比如对于刚才那个牛奶问题.我把状态