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中数据: "); 19 for (i = 0; i < 20; ++i) 20 printf("%d ", ideq[i]); 21 putchar(' '); 22 23 //在头尾加入新数据 24 printf(" 在头尾加入新数据... "); 25 ideq.push_back(100); 26 ideq.push_front(i); 27 28 //输出deque 29 printf(" 输出deque中数据: "); 30 for (pos = ideq.begin(); pos != ideq.end(); pos++) 31 printf("%d ", *pos); 32 putchar(' '); 33 34 //查找 35 const int FINDNUMBER = 19; 36 printf(" 查找%d ", FINDNUMBER); 37 pos = find(ideq.begin(), ideq.end(), FINDNUMBER); 38 if (pos != ideq.end()) 39 printf("find %d success ", *pos); 40 else 41 printf("find failed "); 42 43 //在头尾删除数据 44 printf(" 在头尾删除数据... "); 45 ideq.pop_back(); 46 ideq.pop_front(); 47 48 //输出deque 49 printf(" 输出deque中数据: "); 50 for (pos = ideq.begin(); pos != ideq.end(); pos++) 51 printf("%d ", *pos); 52 putchar(' '); 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