[转载] 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的对象
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
相关文章推荐
- STL-deque 双向队列[转载]
- 【STL】deque双向队列(转载)
- STL系列之deque双向队列的问题
- STL之deque双向队列
- STL之deque(双向队列)
- STL系列之一 deque双向队列
- STL系列之一 deque双向队列
- STL系列之一 deque双向队列
- STL系列之一 deque双向队列
- STL系列之一 deque双向队列
- C++ STL入门教程(3)——deque(双向队列)的使用(附完整程序代码)
- STL系列之一 deque双向队列
- STL系列之一 deque双向队列
- STL系列之一 deque双向队列
- STL --> deque双向队列
- STL双向队列之排队买饭(deque)
- 【STL-deque】双向队列
- STL系列之一 deque双向队列
- STL之queue队列 stack栈 priority_queue优先队列 deque双向队列
- stl之三:deque双向队列【转】