您的位置:首页 > 产品设计 > UI/UE

[转载] STL 之 deque 双向队列

2013-12-17 17:56 225 查看
deque 双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque 在接口上和 vector 非常相似,下面列出 deque 的应用和常用成员函数:

创建deque的对象

deque ()

例如:deque<int> d;

deque (size_type n)

例如:deque<int> d(10); // d 中含10个元素,初始值都为0

deque<size_type n, const T& value>

例如:deque<double> d(10, 5.5); // d 中含10个元素,初始值都为5.5

deque (const deque&)

例如:deque<char> d1(4, 'A');
deque<char> d2(d1); // 拷贝

deque (const InputIterator first, const InputIterator last, const A&a=A)

例如:int iArray[] = {1, 12, 23, 34, 465};
deque<int> d(iArray, iArray+5); // 拷贝 iArray 中的元素到队列 d 中

在队尾插入一个元素

void
push_back(const T&)

例如:d.push_back(10);

在队首插入一个元素

void
push_front(const T&)

例如:d.push_front(10);

在双向队列的 pos 位置插入一个元素

iterator deque::insert(iterator pos, const T& x); // pos = d.begin(), ..., d.end()
例如:deque<int> d;
deque<int>::iterator i;

元素的遍历访问

数组访问

例如:for (int i = 0; i < d.size(); i++)
cout << d[i] << endl;

迭代器正向遍历

例如:deque<string>::iteratori, iend;
iend = d.end();
for (i = d.begin(); i != iend; i++)
cout << *i << endl;

迭代器反向遍历

利用反向迭代器

reverse_iterator rbegin()
reverse_iterator rend()

例如:

deque<int>::reverse_iterator ri, riend;
riend = d.rend();
for (ri = d.rbegin(); ri != riend; ri++)
cout << *ri << endl;

元素的删除

void
pop_front() 删除 deque 第一个元素
void pop_back() 删除 deque 最后一个元素
iterator
erase(iterator pos) 删除 pos 所指向的元素,pos 取值 d.begin() 到 d.end() 之间
iterator erase(iterator first, iterator last) 删除 [first, last) 所指的所有元素
void
clear() 删除所有元素

deque 的交换

void
swap(deque &)
例如:d1.swap(d2); // 交换d1与d2中的元素

判断队列是否为空

bool empty()

队列中元素个数

size_type
size() // size_type 对应是一个无符号整数

系统支持deque容器中存储的最大元素个数

size_type
max_size()

deque 容器首元素

reference
front() // 引用返回,要求 deque 非空

deque 容器末尾元素

reference
back() // 引用返回,要求 deque 非空

deque 容器指定元素

referenceat( size_type pos ) // 返回一个引用,指向双向队列中位置pos上的元素

deque 赋值

assign() 设置双向队列的值
void assign( input_iterator start, input_iterator end) // 用 start 和 end 指示的范围的数据为双向队列赋值
void assign( Size num, const TYPE &val ) // 设置成 num 个 val。

deque 的实现比较复杂,内部会维护一个 map(注意!不是 STL 中的 map 容器)即一小块连续的空间,该空间中每个元素都是指针,指向另一段(较大的)区域,这个区域称为缓冲区,缓冲区用来保存 deque 中的数据。因此 deque 在随机访问和遍历数据会比
vector 慢,不易实现 vector 的 capacity 和 reverse 函数。

对于deque和vector来说,尽量少用erase(pos)和erase(beg,end)。因为这在中间删除数据后会导致后面的数据向前移动,从而使效率低下。具体的 deque 实现可以参考《STL源码剖析》。

deque的使用举例:

//双向队列 deque
#include <deque>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
    deque<int> ideq(20); //Create a deque ideq with 20 elements of default value 0
    deque<int>::iterator pos;
    int i;
    ideq.insert()
    //使用assign()赋值  assign在计算机中就是赋值的意思
    for (i = 0; i < 20; ++i)
        ideq[i] = i;

    //输出deque
    printf("输出deque中数据:\n");
    for (i = 0; i < 20; ++i)
        printf("%d ", ideq[i]);
    putchar('\n');

    //在头尾加入新数据
    printf("\n在头尾加入新数据...\n");
    ideq.push_back(100);
    ideq.push_front(i);

    //输出deque
    printf("\n输出deque中数据:\n");
    for (pos = ideq.begin(); pos != ideq.end(); pos++)
        printf("%d ", *pos);
    putchar('\n');

    //查找
    const int FINDNUMBER = 19;
    printf("\n查找%d\n", FINDNUMBER);
    pos = find(ideq.begin(), ideq.end(), FINDNUMBER);
    if (pos != ideq.end())
        printf("find %d success\n", *pos);
    else
        printf("find failed\n");

    //在头尾删除数据
    printf("\n在头尾删除数据...\n");
    ideq.pop_back();
    ideq.pop_front();

    //输出deque
    printf("\n输出deque中数据:\n");
    for (pos = ideq.begin(); pos != ideq.end(); pos++)
        printf("%d ", *pos);
    putchar('\n');
    
    return 0;
}
参考文章:/article/1392202.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: