STL --> deque双向队列

deque简介

 

  deque是双向开口的连续性存储空间。虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是连续的,deque自身的机制把这一块一块的存储区虚拟地连在一起。

  它首次插入一个元素,默认会动态分配512字节空间,当这512字节空间用完后,它会再动态分配自己另外的512字节空间,然后虚拟地连在一起。deque 的这种设计使得它具有比vector复杂得多的架构、算法和迭代器设计。它的性能损失比之vector,是几个数量级的差别。所以说,deque要慎用。

 

函数 描述
c.assign(beg,end)
c.assign(n,elem)
将[beg; end)区间中的数据赋值给c。
将n个elem的拷贝赋值给c。
c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
c.back() 传回最后一个数据,不检查这个数据是否存在。
c.begin() 传回迭代器重的可一个数据。
c.clear() 移除容器中所有数据。
deque<Elem> c
deque<Elem> c1(c2)
Deque<Elem> c(n)
Deque<Elem> c(n, elem)
Deque<Elem> c(beg,end)
c.~deque<Elem>()
创建一个空的deque。
复制一个deque。
创建一个deque,含有n个数据,数据均已缺省构造产生。
创建一个含有n个elem拷贝的deque。
创建一个以[beg;end)区间的deque。
销毁所有数据,释放内存。
c.empty() 判断容器是否为空。
c.end() 指向迭代器中的最后一个数据地址。
c.erase(pos)
c.erase(beg,end)
删除pos位置的数据,传回下一个数据的位置。
删除[beg,end)区间的数据,传回下一个数据的位置。
c.front() 传回地一个数据。
get_allocator 使用构造函数返回一个拷贝。
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,beg,end)
在pos位置插入一个elem拷贝,传回新数据位置。
在pos位置插入>n个elem数据。无返回值。
在pos位置插入在[beg,end)区间的数据。无返回值。
c.max_size() 返回容器中最大数据的数量。
c.pop_back() 删除最后一个数据。
c.pop_front() 删除头部数据。
c.push_back(elem) 在尾部加入一个数据。
c.push_front(elem) 在头部插入一个数据。
c.rbegin() 传回一个逆向队列的第一个数据。
c.rend() 传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num) 重新指定队列的长度。
c.size() 返回容器中实际数据的个数。
C1.swap(c2)
Swap(c1,c2)
将c1和c2元素互换。
同上操作。

 

deque的使用范例:

 1 //双向队列 deque
 2 //by MoreWindows http://blog.csdn.net/morewindows
 3 #include <deque>
 4 #include <cstdio>
 5 #include <algorithm>
 6 using namespace std;
 7 int main()
 8 {
 9     deque<int> ideq(20); //Create a deque ideq with 20 elements of default value 0
10     deque<int>::iterator pos;
11     int i;
12 
13     //使用assign()赋值  assign在计算机中就是赋值的意思
14     for (i = 0; i < 20; ++i)
15         ideq[i] = i;
16     
17     //输出deque
18     printf("输出deque中数据:\n");
19     for (i = 0; i < 20; ++i)
20         printf("%d ", ideq[i]);
21     putchar('\n');
22 
23     //在头尾加入新数据
24     printf("\n在头尾加入新数据...\n");
25     ideq.push_back(100);
26     ideq.push_front(i);
27 
28     //输出deque
29     printf("\n输出deque中数据:\n");
30     for (pos = ideq.begin(); pos != ideq.end(); pos++)
31         printf("%d ", *pos);
32     putchar('\n');
33 
34     //查找
35     const int FINDNUMBER = 19;
36     printf("\n查找%d\n", FINDNUMBER);
37     pos = find(ideq.begin(), ideq.end(), FINDNUMBER);
38     if (pos != ideq.end())
39         printf("find %d success\n", *pos);
40     else
41         printf("find failed\n");
42 
43     //在头尾删除数据
44     printf("\n在头尾删除数据...\n");
45     ideq.pop_back();
46     ideq.pop_front();
47 
48     //输出deque
49     printf("\n输出deque中数据:\n");
50     for (pos = ideq.begin(); pos != ideq.end(); pos++)
51         printf("%d ", *pos);
52     putchar('\n');
53     return 0;
54 }

 

/*deque: 是一个double-ended queue,
    1)支持随即存取,也就是[]操作符,
    2)支持两端操作,push(pop)-back(front),在两端操作上与list效率差不多

    因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
    1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
    2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
    3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
*/

 

出处:http://blog.csdn.net/morewindows/article/details/6946811

 

posted @ 2015-06-04 20:51  蚂蚁吃大象、  阅读(315)  评论(0编辑  收藏  举报