stl-deque
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 和 ienddeque<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() {// d1deque<int> d1;d1.push_back(11);d1.push_back(12);d1.push_back(13);cout << "d1 = ";print(d1);// d2deque<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; }
总结
- 上一篇: 推荐系统从0到1_1
- 下一篇: 2022中国供应链物流创新科技报告