关于c++:C-STL-deque容器

一、前言

deque 是 double-ended queue 的缩写,又称双端队列容器。deque 容器和 vecotr 容器有很多相似之处:
①deque 容器也善于在序列尾部增加或删除元素(工夫复杂度为O(1)),而不善于在序列两头增加或删除元素
②deque 容器也能够依据须要批改本身的容量和大小
与vector不同的是:deque 还善于在序列头部增加或删除元素,所消耗的工夫复杂度也为常数阶O(1)。deque 容器中存储元素并不能保障所有元素都存储到间断的内存空间中。
当须要向序列两端频繁的增加或删除元素时,应首选 deque 容器。deque 容器以模板类 deque<T>(T 为存储元素的类型)的模式在 <deque> 头文件中,并位于 std 命名空间中。因而,在应用该容器之前,代码中须要蕴含上面两行代码:

#include <deque>
using namespace std;

二、详解

1、初始化deque容器

①std::deque<int> d;
②std::deque<int> d(10);
③std::deque<int> d(10, 5);
④std::deque<int> d2(d);
⑤//拷贝一般数组,创立deque容器
int a[] = { 1,2,3,4,5 };
std::deque<int>d(a, a + 5);
⑥//实用于所有类型的容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::deque<int>d(arr.begin()+2, arr.end());//拷贝arr容器中的{13,14,15}

①创立空的deque容器,和空 array 容器不同,空的 deque 容器在创立之后能够做增加或删除元素的操作
②创立一个具备10个元素、元素默认值为0的deque容器
③创立一个具备10个元素的deque容器,指定初始值为5的deque容器
④拷贝初始化deque容器d2,须要保障新旧容器存储的元素类型统一

2、成员函数

函数 性能
begin() 返回指向容器中第一个元素的迭代器
end() 返回指向容器最初一个元素所在位置后一个地位的迭代器,通常和 begin() 联合应用
rbegin() 返回指向最初一个元素的迭代器
rend() 返回指向第一个元素所在位置前一个地位的迭代器
cbegin() 和 begin() 性能雷同,只不过在其根底上,减少了 const 属性,不能用于批改元素
cend() 和 end() 性能雷同,只不过在其根底上,减少了 const 属性,不能用于批改元素
crbegin() 和 rbegin() 性能雷同,只不过在其根底上,减少了 const 属性,不能用于批改元素
crend() 和 rend() 性能雷同,只不过在其根底上,减少了 const 属性,不能用于批改元素
size() 返回理论元素个数
max_size() 返回容器所能包容元素个数的最大值,个别是 232-1
resize() 扭转理论元素的个数
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false
shrink _to_fit() 将内存缩小到等于以后元素理论所应用的大小
at() 应用通过边界查看的索引拜访元素
front() 返回第一个元素的援用
back() 返回最初一个元素的援用
assign() 用新元素替换原有内容
push_back() 在序列的尾部增加一个元素
push_front() 在序列的头部增加一个元素
pop_back() 移除容器尾部的元素
insert() 在指定的地位插入一个或多个元素
erase() 移除一个元素或一段元素
clear() 移出所有的元素,容器大小变为 0
swap() 替换两个容器的所有元素
emplace() 在指定的地位间接生成一个元素
emplace_front() 在容器头部生成一个元素。和 push_front() 的区别是,该函数间接在容器头部结构元素,省去了复制挪动元素的过程
emplace_back() 在容器尾部生成一个元素。和 push_back() 的区别是,该函数间接在容器尾部结构元素,省去了复制挪动元素的过程
std::swap(x , y) 非成员函数,替换数据

阐明:与vector相比,额定减少了实现在容器头部增加和删除元素的成员函数,同时删除了 capacity()、reserve() 和 data() 成员函数。

三、实例

1、初始化

//初始化deque
    //拷贝一般数组,创立deque容器
    int a[] = { 10,25,37,40,15 };
    std::deque<int> dequeInt(a, a + 5);

 
    //下标拜访
    for (int i = 0; i < dequeInt.size(); i++)
    {
        std::cout << "dequeInt[" << i << "]=" << dequeInt[i] << std::endl;
    }
    std::cout << "dequeInt size: " << dequeInt.size() << std::endl;

    //迭代器拜访
    int i = 0;
    std::deque<int>::iterator dequeIter = dequeInt.begin();
    for (; dequeIter != dequeInt.end(); dequeIter++)
    {
        std::cout << "iterator dequeInt[" << i << "]=" << *dequeIter << std::endl;
    }
    std::cout << "iterator dequeInt size: " << dequeInt.size() << std::endl;


    dequeInt.push_front(190);
    dequeInt.push_back(9001);

    for (int i = 0; i < dequeInt.size(); i++)
    {
        std::cout << "push_front and push_back dequeInt[" << i << "]=" << dequeInt[i] << std::endl;
    }
    std::cout << "push_front and push_back dequeInt size: " << dequeInt.size() << std::endl;

后果如下:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理