deque(双端队列)
需要包括头文件<deque>;
定义:
deque<数据类型> 变量名;
Eg:
deque<int> que;//定义了一个整型的双端队列;
基本操作(红色标识为常用操作):
que.assign(beg,end) 将[beg; end)区间中的数据赋值给que。
que.assign(n,elem) 将n个elem的拷贝赋值给que。
que. at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
que.back() 返回容器que的最后一个元素的引用。如果que为空,则该操作未定义。
que.begin() 传回迭代器中的第一个数据地址。
que.clear() 移除容器中所有数据。
que.empty() 判断容器是否为空。
que.end() 返回一个迭代器,它指向容器que的最后一个元素的下一位置。
que.erase(pos) 删除pos位置的数据,传回下一个数据的位置。
que.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
que.front() 返回容器que的第一个元素的引用。如果que为空,则该操作为空。
que.insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置
que.insert(pos,n,elem) 在pos(迭代器)位置插入>n个elem数据。无返回值
que.insert(pos,beg,end) 在pos位置插入在[beg,end)区间的数据。无返回值
que.max_size() 返回容器que可容纳的最多元素个数。
que.pop_back() 删除最后一个数据。
que.pop_front() 删除头部数据。
que.push_back(elem) 在尾部加入一个数据。
que.push_front(elem) 在头部插入一个数据。
que.rbegin() 返回一个逆序迭代器,它指向容器que的最后一个元素。
que.rend() 返回一个逆序迭代器,它指向容器que的第一个元素的前一个位置。
que.resize(num) 重新指定队列的长度。
que.size() 返回容器中实际数据的个数。
que.swap(que2) 交换容器que和que2中的所有元素。
swap(que1,que2) 交换容器que1和que2中的所有元素。
代码解释:
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque<int> dInt;
dInt.push_back(1);
dInt.push_back(3);
dInt.push_back(5);
dInt.push_back(7);
for (int i=0; i<dInt.size(); i++)
{
// 打印 d[0], d[1], d[2], d[3]。访问越界时,不产生异常
cout << "d[" << i << "]=" << dInt[i] << endl;
// 输出 dInt 中各个元素。当访问越界时,会抛出异常
// cout << dInt.at(i) << endl;
}
return 0;
}
-------------------------------------------------------- 用迭代器访问 deque 元素
#pragma warning(disable:4786) // 必须放在首行,忽略长字符的截断警告
#include <deque>
#include <iostream>
#include <string>
using namespace std;
int main()
{
deque<string> dStr;
dStr.push_back("北京");
dStr.push_back("2008");
dStr.push_back("奥运");
// 迭代器 i 和 iend
deque<string>::iterator i, iend;
iend = dStr.end();
int j;
// 打印 “北京2008奥运”
for (i=dStr.begin(), j=0; i!=iend; ++i, ++j)
cout << *i;
cout << endl;
return 0;
}
/* 解释:
由于 deque 使用了两个迭代器分别指向双端队列的首尾,因此,deque 具有高效的【头部】插入元素的函数 push_front()
其他位置的插入,将涉及相关元素的移位拷贝。
*/
-------------------------------------------------------- 头部和中间位置插入 deque 元素
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque<int> dInt;
dInt.push_back(6);
dInt.push_back(7);
// 头部插入
dInt.push_front(5);
for (int i=0; i<dInt.size(); i++)
cout << dInt[i] << ' ';
cout << endl;
// 中间位置插入
// 在第2个元素之前插入9, 即 5 9 6 7
dInt.insert(dInt.begin() + 1, 9);
for (int j=0; j<dInt.size(); j++)
cout << dInt[j] << ' ';
cout << endl;
return 0;
}
/* 解释:
deque 容器提供了删除首元素的 pop_front 函数,删除尾元素的 pop_back 函数,删除任意位置或迭代器区间上元素的 erase 函数,以及删除所有元素的 clear 函数。
1. void pop_front(); 删除 deque 的第一个元素
2. void pop_back(); 删除 deque 的最后一个元素
3. iterator erase(iterator pos); 删除 pos 所指向的元素
4. iterator erase(iterator first, iterator last); 删除 迭代器区间 [first, last) 所指向的所有元素。
5. void clear(); 删除所有元素
*/
-------------------------------------------------------- 头尾和其他位置删除 deque 元素
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque<int> dInt;
dInt.push_back(4);
dInt.push_back(5);
dInt.push_back(3);
dInt.push_back(3);
dInt.push_back(3);
dInt.push_back(6);
for (int i=0; i<dInt.size(); i++)
cout << dInt[i] << ' ';
cout << endl;
// 头尾和任意删除元素
dInt.erase(dInt.begin() + 1); // 删除第 2 个元素 dInt[1]
dInt.pop_front(); // 删除首元素
dInt.pop_back(); // 删除末尾元素
for (int j=0; j<dInt.size(); j++)
cout << dInt[j] << ' ';
cout << endl;
// 删除所有元素
dInt.clear();
cout << "执行 clear() " << endl << "deque 元素全部清除" << endl;
return 0;
}
-------------------------------------------------------- deque 元素的反向遍历
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque<int> dInt;
dInt.push_back(1);
dInt.push_back(3);
dInt.push_back(5);
dInt.push_back(7);
dInt.push_back(9);
dInt.push_back(11);
// deque元素的前向遍历
deque<int>::iterator i,iend;
iend = dInt.end();
for (i=dInt.begin(); i!=iend; ++i)
cout << *i << ' ';
cout << endl;
// deque元素的反向遍历
deque<int>::reverse_iterator ri, riend;
riend = dInt.rend();
for (ri=dInt.rbegin(); ri!=riend; ++ri)
cout << *ri << ' ';
cout << endl;
return 0;
}
-------------------------------------------------------- 两个 deque 容器的元素交换
#include <deque>
#include <iostream>
using namespace std;
void print(deque<int>& d);
int main()
{
// d1
deque<int> d1;
d1.push_back(11);
d1.push_back(12);
d1.push_back(13);
cout << "d1 = ";
print(d1);
// d2
deque<int> d2;
d2.push_back(90);
d2.push_back(91);
d2.push_back(92);
cout << "d2 = ";
print(d2);
// d1 和 d2 交换
d1.swap(d2);
cout << "d1 和 d2 交换后" << endl;
cout << "d1 = ";
print(d1);
cout << "d2 = ";
print(d2);
return 0;
}
// deque 元素打印
void print(deque<int>& d)
{
for (int i=0; i<d.size(); i++)
cout << d[i] << ' ';
cout << endl;
}
/* 解释:
deque 其他函数的说明,参加 Random access container 、 Back insertion sequence 和 Front insertion sequence 概念的函数定义要求,下面给出 deque 的其他几个常用函数的用法。
bool empty() 判断 deque 容器是否已有元素,是则返回 true,否则返回 false
size_type size() 当前 deque 容器的元素个数
size_type max_size() 系统所支持的 deque 容器的最大元素个数
reference front() deque容器的首元素(引用返回),要求 deque 不为空
reference back() deque容器的末元素(引用返回),要求 deque 不为空
*/
-------------------------------------------------------- deque 其他常用函数的使用
#pragma warning(disable:4786)
#include <deque>
#include <iostream>
#include <string>
using namespace std;
int main()
{
deque<string> dStr;
// 打印 deque 为空
cout << "dStr是否为空: " << dStr.empty() << endl;
// 装入deque 元素
dStr.push_back("红楼梦");
dStr.push_back("三国演义");
dStr.push_back("西游记");
dStr.push_back("水浒传");
dStr.push_back("史记");
dStr.push_back("莫言");
dStr.push_back("金庸");
dStr.push_back("何亮到此一游");
// 打印 deque 所有元素
deque<string>::iterator i, iend;
iend = dStr.end();
for (i=dStr.begin(); i!=iend; ++i)
cout << *i << " ";
cout << endl;
// 打印首元素
cout << "deque 首元素为: " << dStr.front() << endl;
// 打印末元素
cout << "deque 末元素为: " << dStr.back() << endl;
// 打印元素个数
cout << "deque 元素个数为: " << dStr.size() << endl;
// 打印可支持的最大 deque 元素个数
cout << "deque 最大元素个数为: " << dStr.max_size() << endl;
return 0;
}