STL之deque学习总结(C++)

概述

  1. STL提供3种顺序容器:vector、list、deque。vector和deque都是基于数组的,list实现链表数据结构。
  2. deque是double-ended queue(双头队列)。deque类在一个容器中提供了vector和list的许多好处。
  3. deque类能利用下标提供有效的索引访问,可以像vector一样读取与修改元素,还像list一样能有效地在前面和后面进行插入和删除操作。
  4. 需要增加deque的存储空间时,可以在内存块中deque两端进行分配,通常保存为这些块的指针数组。
  5. 对deque分配存储块之后,有些版本要删除deque时才释放这个块,这样使deque比重复分配、释放和再分配内存块时更加有效,但也更浪费内存。
  6. deque利用非连续内存布局,因此deque迭代器比vector和基于指针的数组中用于迭代的指针更加智能化。
  7. deque支持随机访问迭代器,即list可以使用下表内所有的迭代器操作。
    STL之deque学习总结(C++)

具体用法

0. 头文件

#include<deque>

1. 声明和初始化

//声明list类的实例list1,存放int值,生成了一个长度为0的空list,容量capacity为0
	deque<int>de;

//声明一个list类型的二维链表list1
	deque<deque<int>>de;

//声明一个list类型的一维链表list1,并将{1,2,3,4}赋值给list1
	deque<int>de = { 1,2,3,4 };

//生成一个链表list1,将list2复制给list1
	deque<int>de = de1;
或 deque<int>de(de1);
或  deque<int>de(de1.begin(), de1.end());

//生成一个链表list1,将数组a的a[0]到a[4]的内容复制给list1
	deque<int>de(a, a + 5);
或  deque<int>de(&a[0], &a[4]);

//生成一个链表list1,将大小设为10,且每个元素都为设置为0(默认)
	deque<int>de(10);

//生成一个链表list1,将大小设为10,且每个元素都为设置为5
	deque<int>de(10, 5);

//将list1清空,然后添加2个元素,每个元素都赋值为10
	de.assign(2, 10);

//声明二维链表list1,将两个一维链表赋值给list1
	deque<deque<int>>de;
	deque<int>de1 = { 1,2,3,4 };
	deque<int>de2 = { 2,4,6,8 };
	de.push_back(de1);
	de.push_back(de2);



2. 常用函数(查询)

2.1 empty()

de.empty(); //返回值bool类型,若de为空,则返回true

2.2 size()

de.size(); //返回值为int类型,de当前存放的元素的个数

2.3 front()

条件:de不能为空,否则de.front()结果是未定义!

de.front(); //返回de最前面的元素,即de[0]

2.4 back()

条件:de不能为空,否则de.back()结果是未定义!

de.back(); //返回de最末尾的元素,即de[de.size()-1]

2.5 迭代器

deque的迭代器通常实现为deque元素的指针。

//开始指针(正向)
de.begin()

//结束指针(正向),指向de最后一个元素的后一位
de.end()

//开始指针(逆向)
de.rbegin()

//结束指针(逆向),指向de最后一个元素的后一位
de.rend()

//常量开始指针(正向),不能通过该指针来修改所指内容
de.cbegin()

//常量结束指针(正向),不能通过该指针来修改所指内容,指向de最后一个元素的后一位
de.cend()

2.6 输出

//迭代器,顺序访问
	for (deque<int>::iterator p = nums.begin(); p != nums.end(); p++)
		cout << *p << " ";
		
//输出迭代器,copy算法
	ostream_iterator<int> output(cout, " ");
	copy(de.begin(),de.end(),output);
	cout<<endl;		
	
//迭代器,逆序访问
	for (deque<int>::reverse_iterator p = nums.rbegin(); p != nums.rend(); p++)
		cout << *p << " ";

//若是二维deque,注意传入参数是按值传递(不是&nums)因此在函数里对向量的修改不影响真正的向量的元素。顺序访问
void display_deque_two(deque<deque<int>> nums) {
	while (!nums.empty()) {
		for (deque<int>::iterator p = nums.front().begin(); p != nums.front().end(); p++)
			cout << *p << " ";
		cout << endl;
		nums.erase(nums.begin()); 
	}
}

//还有一个基础的类似二维数组a[ ][ ]的输出方法,用下标运算符[ ]来输出,顺序访问
void display_deque_two(deque<deque<int>> nums) {
	for (int i = 0; i < nums.size(); i++) {
		for (int j = 0; j < nums[i].size(); j++) {
			cout << nums[i][j] << " ";
		}
		cout << endl;
	}
}

3. 常用函数(操作)

3.1 push_back()

//在de末尾添加元素2
	de.push_back(2);

3.2 push_front()

//在de开头添加元素3
	de.push_front(3);

3.3 pop_front()

//删除de开头元素
	de.pop_front();

3.4 pop_back()

//删除de末尾元素
	de.pop_back();

3.5 assign()

//将de清空,然后将de1元素从头到尾复制给de
	de.assign(de1.begin(), de1.end());

//将de清空,然后添加2个元素,每个元素都赋值为10
	de.assign(2, 10);

3.6 insert()

//在de开头前插入10
	de.insert(de.begin(),10);
//在de后插入de1的从头开始往后的共3个元素
	de.insert(de.end(), de1.begin(), de1.begin() + 3);

3.7 erase()

//删除de头部的元素
	de.erase(de.begin());

//删除list1从头开始往后的3个元素
	de.erase(de.begin(), de.begin()+3);

3.8 swap()

//将list1和list2交换
	de.swap(de1);

3.9 resize()

//重置向量的大小为10
	de.resize(10);

3.10 clear()

//清空向量
	de.clear();

4. 常用算法

4.0 头文件

#include<algorithm>

4.1 copy()

//将de1从头到尾的内容复制给de
copy(de1.begin(),de1.end(),de);