转载请注明:http://www.cnblogs.com/ACshasow/ios
STL——deque学习笔记网络
概念:数据结构
(deque,全名double-ended queue)是一种具备队列和栈的性质的数据结构。双端队列中的元素能够从两端弹出,其限定插入和删除操做在表的两端函数
进行。性能
双端队列是限定插入和删除操做在表的两端进行的线性表。这两端分别称作端点1和端点2。也可像栈同样,能够用一个铁道转轨网络来比喻双端队列。在实际使用中,还能够有输出受限的双端队列(即一个端点容许插入和删除,另外一个端点只容许插入的双端队列)和输入受限的双端队列(即一个端点容许插入和删除,另外一个端点只容许删除的双端队列)。而若是限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了学习
函数构造:大数据
deque<Elem> c 创建一个空的deque。spa
deque<Elem> c1(c2) 复制一个deque。code
deque<Elem> c(n) 建立一个deque,含有n个数据,数据均已缺省构造产生。htm
deque<Elem> c(n, elem) 建立一个含有n个elem拷贝的deque
deque<Elem> c(beg,end) 建立一个以[beg;end)区间的deque
c.~deque<Elem>() 销毁全部数据,释放内存
成员函数:
c.assign(beg,end) 将[beg; end)区间中的数据赋值给c。
c.assign(n,elem) 将n个elem的拷贝赋值给c。
c. at(idx) 传回索引idx所指的数据,若是idx越界,抛出out_of_range。
c.back() 传回最后一个数据,不检查这个数据是否存在。
c.begin() 传回迭代器中的第一个数据。
c.clear() 移除容器中全部数据。
c.empty() 判断容器是否为空。
c.end() 指向迭代器中的最后一个数据地址。
c.erase(pos) 删除pos位置的数据,传回下一个数据的位置。
c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
c.front() 传回第一个数据。
get_allocator 使用构造函数返回一个拷贝。
c.insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置
c.insert(pos,n,elem) 在pos位置插入>n个elem数据。无返回值
c.insert(pos,beg,end) 在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() 返回容器中实际数据的个数。
c.swap(c2) 将c1和c2元素互换。
swap(c1,c2) 将c1和c2元素互换。
特色:
一、支持随机访问,即支持[]以及at(),可是性能没有vector好。
二、支持两端操做,push(pop)-back(front),但性能不及list。
最佳使用状况:
一、须要在两端插入和删除元素。
二、无需引用容器内的元素。
三、要求容器释放再也不使用的元素。
示例:
#include <iostream> #include<deque> using namespace std; int main() { deque<int> mydeque (7,6); // 初始化deque为7个int,每一个int值为6 mydeque.push_front(2); //插入头 mydeque.push_back(3); //插入尾 cout << "mydeque size: " << mydeque.size() << endl; cout << "mydeque contains:"; for (unsigned i=0; i<mydeque.size();i++) cout << " " << mydeque[i]; cout << endl; return 0; }
vector、list、deque、三个容器的选择:
一、若是你须要高效的随即存取,而不在意插入和删除的效率,使用vector
二、若是你须要大量的插入和删除,而不关心随即存取,则应使用list
三、若是你须要随即存取,并且关心两端数据的插入和删除,则应使用deque。