乐趣区

关于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;

后果如下:

退出移动版