C++ deque容器

C++ deque容器


文章目录

  • C++ deque容器
  • 前言
    • 1. deque容器基本概念
    • 2. deque构造函数
    • 3. deque赋值操作
    • 4. deque大小操作
    • 5. deque 插入和删除
    • 6. deque 数据存取
    • 7. deque 排序
  • 总结


前言

本文包含deque容器基本概念、deque构造函数、deque赋值操作、deque大小操作、deque插入和删除、deque数据存取、deque排序。


1. deque容器基本概念

功能:

双端数组,可以对头端进行插入删除操作

deque与vector区别:

(1)、vector对于头部的插入删除效率低,数据量越大,效率越低

(2)、deque相对而言,对头部的插入删除速度回比vector快

(3)、vector访问元素时的速度会比deque快,这和两者内部实现有关
C++ deque容器_第1张图片
deque内部工作原理:

(1)、deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据

(2)、中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间

(3)、deque容器的迭代器也是支持随机访问的
C++ deque容器_第2张图片

2. deque构造函数

功能描述:

deque容器构造

函数原型:

(1)、deque deqT; 默认构造形式

(2)、deque(beg, end); 构造函数将[beg, end)区间中的元素拷贝给本身

(3)、deque(n, elem); 构造函数将n个elem拷贝给本身

(4)、deque(const deque &deq); 拷贝构造函数

// deque双端数组容器构造函数

#include   // 包含标准输入输出流头文件
using namespace std;  // 使用标准命名空间

#include   // 使用deque双端数组容器,需包含头文件deque

// const对此容器只是只读,不可以修改
void Fun_Print(const deque<int>& d) {   // 使用引用方式&,传入deque类型的形参d

	// deque::iterator 拿到deque这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
	// const_iterator只读迭代器;iterator普通迭代器
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {

		//*it= 100;  // 报错,容器中数据不可修改:表达式必须是可修改的左值

		cout << *it << " ";  // it是个迭代器类型,本是是个指针,需使用*解引用
	}
	cout << endl;
}

void test() {

	// 1、默认构造方式,无参构造
	deque<int> d;

	for (int i = 0; i < 10; i++)
	{
		// push_back()向容器尾部插入数据i
		d.push_back(i);
	}
	Fun_Print(d);  // 0 1 2 3 4 5 6 7 8 9

	// 2、将d容器开始迭代器到结束迭代器之间的数据元素,拷贝给d1容器
	deque<int> d1(d.begin(), d.end());
	Fun_Print(d1);  // 0 1 2 3 4 5 6 7 8 9

	// 3、将10个100拷贝给d2容器
	deque<int> d2(10, 100);
	Fun_Print(d2);  // 100 100 100 100 100 100 100 100 100 100

	// 4、拷贝构造
	deque<int> d3(d2);
	Fun_Print(d3);  // 100 100 100 100 100 100 100 100 100 100
}

int main() {

	test();

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

C++ deque容器_第3张图片

3. deque赋值操作

功能描述:

给deque容器进行赋值

函数原型:

(1)、deque& operator=(const deque &deq); 重载等号操作符

(2)、assign(beg, end); 将[beg, end)区间中的数据拷贝赋值给本身

(3)、assign(n, elem); 将n个elem拷贝赋值给本身

// deque双端数组容器赋值

#include   // 包含标准输入输出流头文件
using namespace std;  // 使用标准命名空间

#include   // 使用deque双端数组容器,需包含头文件deque

// const对此容器只是只读,不可以修改
void Fun_Print(const deque<int>& d) {   // 使用引用方式&,传入deque类型的形参d

	// deque::iterator 拿到deque这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
	// const_iterator只读迭代器;iterator普通迭代器
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {

		//*it= 100;  // 报错,容器中数据不可修改:表达式必须是可修改的左值

		cout << *it << " ";  // it是个迭代器类型,本是是个指针,需使用*解引用
	}
	cout << endl;
}

void test() {

	// 创建deque容器对象,并且通过模板参数指定容器中存放的数据的类型
	deque<int> d;

	for (int i = 0; i < 10; i++)
	{
		// push_back()向容器尾部插入数据i
		d.push_back(i);
	}
	Fun_Print(d);  // 0 1 2 3 4 5 6 7 8 9

	// 1、重载operator=
	deque<int> d1;
	d1 = d;
	Fun_Print(d1);  // 0 1 2 3 4 5 6 7 8 9

	// 2、将d容器开始迭代器到结束迭代器之间的数据元素,赋值给d2容器
	deque<int> d2;
	d2.assign(d.begin(), d.end());
	Fun_Print(d2);  // 0 1 2 3 4 5 6 7 8 9

	// 3、将10个100赋值给d3
	deque<int> d3;
	d3.assign(10, 100);
	Fun_Print(d3);  // 100 100 100 100 100 100 100 100 100 100
}

int main() {

	test();

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

C++ deque容器_第4张图片

4. deque大小操作

功能描述:

对deque容器的大小进行操作 (没有容量,可以无限扩展)

函数原型:

(1)、deque.empty(); 判断容器是否为空

(2)、deque.size(); 返回容器中元素的个数

(3)、deque.resize(num);

3.1)、重新指定容器的长度为num,若容器变长,则以默认值填充新位置 (默认填充0)

3.2)、如果容器变短,则末尾超出容器长度的元素被删除

(4)、deque.resize(num, elem);

4.1)、重新指定容器的长度为num,若容器变长,则以elem值填充新位置 (填充elem)

4.2)、如果容器变短,则末尾超出容器长度的元素被删除

// deque双端数组容器大小操作

#include   // 包含标准输入输出流头文件
using namespace std;  // 使用标准命名空间

#include   // 使用deque双端数组容器,需包含头文件deque

// const对此容器只是只读,不可以修改
void Fun_Print(const deque<int>& d) {   // 使用引用方式&,传入deque类型的形参d

	// deque::iterator 拿到deque这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
	// const_iterator只读迭代器;iterator普通迭代器
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {

		//*it= 100;  // 报错,容器中数据不可修改:表达式必须是可修改的左值

		cout << *it << " ";  // it是个迭代器类型,本是是个指针,需使用*解引用
	}
	cout << endl;
}

void test() {

	// 创建deque容器对象,并且通过模板参数指定容器中存放的数据的类型
	deque<int> d;

	for (int i = 0; i < 10; i++)
	{
		// push_back()向容器尾部插入数据i
		d.push_back(i);
	}
	Fun_Print(d);  // 0 1 2 3 4 5 6 7 8 9

	// 1、empty()判断容器是否为空,返回真,则为空
	if (d.empty()) {
		cout << "d容器为空!" << endl;
	}
	else {
		cout << "d容器不为空!" << endl;

		// 2、size()返回容器数据元素个数
		cout << "d容器个数为:" << d.size() << endl;  // 10
	}

	// 3.1、resize()指定容器长度为15,默认填充0
	d.resize(15);
	Fun_Print(d);  // 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0

	// 3.2、resize()指定容器长度为5,删除超出容器长度的数据元素
	d.resize(5);
	Fun_Print(d);  // 0 1 2 3 4

	// 4.1、resize()指定容器长度为10,默认填充10
	d.resize(10, 10);
	Fun_Print(d);  // 0 1 2 3 4 10 10 10 10 10

	// 4.2、resize()指定容器长度为5,删除超出容器长度的数据元素
	d.resize(5, 5);
	Fun_Print(d);  // 0 1 2 3 4
}

int main() {

	test();

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

C++ deque容器_第5张图片

5. deque 插入和删除

功能描述:

向deque容器中插入和删除数据

函数原型:

(1)、两端插入操作:

push_back(elem); 在容器尾部添加一个数据

push_front(elem); 在容器头部插入一个数据

pop_back(); 删除容器最后一个数据

pop_front(); 删除容器第一个数据

// deque双端数组容器插入

#include   // 包含标准输入输出流头文件
using namespace std;  // 使用标准命名空间

#include   // 使用deque双端数组容器,需包含头文件deque

// const对此容器只是只读,不可以修改
void Fun_Print(const deque<int>& d) {   // 使用引用方式&,传入deque类型的形参d

	// deque::iterator 拿到deque这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
	// const_iterator只读迭代器;iterator普通迭代器
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {

		//*it= 100;  // 报错,容器中数据不可修改:表达式必须是可修改的左值

		cout << *it << " ";  // it是个迭代器类型,本是是个指针,需使用*解引用
	}
	cout << endl;
}

void test() {

	// 创建deque容器对象,并且通过模板参数指定容器中存放的数据的类型
	deque<int> d;

	// 1、push_back()向容器尾部插入数据1、2
	d.push_back(1);
	d.push_back(2);
	Fun_Print(d);  // 1 2

	// 2、push_front()向容器头部插入数据3、4
	d.push_front(3);
	d.push_front(4);
	Fun_Print(d);  // 4 3 1 2

	// 3、pop_back()删除容器最后一个数据
	d.pop_back();
	Fun_Print(d);  // 4 3 1 

	// 4、pop_front()删除容器第一个数据
	d.pop_front();
	Fun_Print(d);  // 3 1
}

int main() {

	test();

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

C++ deque容器_第6张图片
(2)、指定位置操作:

insert(pos,elem); 在pos位置插入一个elem元素的拷贝,返回新数据的位置

insert(pos,n,elem); 在pos位置插入n个elem数据,无返回值

insert(pos,beg,end); 在pos位置插入[beg,end)区间的数据,无返回值

erase(beg,end); 删除[beg,end)区间的数据,返回下一个数据的位置

erase(pos); 删除pos位置的数据,返回下一个数据的位置

clear(); 清空容器的所有数据

// deque双端数组容器插入和删除

#include   // 包含标准输入输出流头文件
using namespace std;  // 使用标准命名空间

#include   // 使用deque双端数组容器,需包含头文件deque

// const对此容器只是只读,不可以修改
void Fun_Print(const deque<int>& d) {   // 使用引用方式&,传入deque类型的形参d

	// deque::iterator 拿到deque这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
	// const_iterator只读迭代器;iterator普通迭代器
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {

		//*it= 100;  // 报错,容器中数据不可修改:表达式必须是可修改的左值

		cout << *it << " ";  // it是个迭代器类型,本是是个指针,需使用*解引用
	}
	cout << endl;
}

void test() {

	// 创建deque容器对象,并且通过模板参数指定容器中存放的数据的类型
	deque<int> d;

	// 1、insert()在容器开始迭代器处插入数据10
	d.insert(d.begin(), 10);
	Fun_Print(d);  // 10

	// 2、insert()在容器结束迭代器处插入5个10
	d.insert(d.end(), 5, 100);
	Fun_Print(d);  // 10 100 100 100 100 100

	// 3、insert()在容器结束迭代器处,插入d容器开始迭代器到结束迭代器中的数据元素
	d.insert(d.end(), d.begin(), d.end());
	Fun_Print(d);  // 10 100 100 100 100 100 10 100 100 100 100 100
	
	deque<int>::iterator it = d.begin();  // 创建一个迭代器it
	it += 6;  // 使it位置为6
	// 4、erase()按区间删除数据元素,从第6个迭代器位置开始,删除d容器之后所有数据元素
	d.erase(it, d.end());
	Fun_Print(d);  // 10 100 100 100 100 100

	// 5、erase()删除d容器开始迭代器的数据元素
	d.erase(d.begin());
	Fun_Print(d);  // 100 100 100 100 100

	// 6、clear()清空容器所有数据元素
	d.clear();
	Fun_Print(d);  // 
}

int main() {

	test();

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

C++ deque容器_第7张图片

6. deque 数据存取

功能描述:

对deque 中的数据的存取操作

函数原型:

(1)、at(int idx); 返回索引idx所指的数据

(2)、operator[]; 返回下标idx所指的数据

(3)、front(); 返回容器中第一个数据元素

(4)、back(); 返回容器中最后一个数据元素

// deque双端数组容器数据存取

#include   // 包含标准输入输出流头文件
using namespace std;  // 使用标准命名空间

#include   // 使用deque双端数组容器,需包含头文件deque

void test() {

	// 创建deque容器对象,并且通过模板参数指定容器中存放的数据的类型
	deque<int> d;

	for (int i = 0; i < 10; i++)
	{
		// push_back()向容器尾部插入数据i
		d.push_back(i);
	}

	// 1、at()返回容器索引i所指的数据元素
	for (int i = 0; i < d.size(); i++) {  // size()返回容器数据元素个数
		cout << d.at(i) << " ";  // 0 1 2 3 4 5 6 7 8 9
	}
	cout << endl;

	// 2、[]返回容器下标i所指的数据元素
	for (int i = 0; i < d.size(); i++) {
		cout << d[i] << " ";  // 0 1 2 3 4 5 6 7 8 9
	}
	cout << endl;

	// 3、front()返回容器的第一个数据元素
	cout << "d容器的第一个数据元素为:" << d.front() << endl;  // 0

	// 4、front()返回容器的最后一个数据元素
	cout << "d容器的最后一个数据元素为:" << d.back() << endl;  // 9
}

int main() {

	test();

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

C++ deque容器_第8张图片

7. deque 排序

功能描述:

利用算法实现对deque容器进行排序

算法:

sort(iterator beg, iterator end) 对beg和end区间内元素进行排序

// deque双端数组容器排序

#include   // 包含标准输入输出流头文件
using namespace std;  // 使用标准命名空间

#include   // 使用deque双端数组容器,需包含头文件deque
#include   // 标准算法头文件;使用sort,需包含头文件algorithm

// const对此容器只是只读,不可以修改
void Fun_Print(const deque<int>& d) {   // 使用引用方式&,传入deque类型的形参d

	// deque::iterator 拿到deque这种容器的迭代器类型;每个容器都有一个专属的迭代器类型
	// const_iterator只读迭代器;iterator普通迭代器
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {

		//*it= 100;  // 报错,容器中数据不可修改:表达式必须是可修改的左值

		cout << *it << " ";  // it是个迭代器类型,本是是个指针,需使用*解引用
	}
	cout << endl;
}

void test() {

	// 创建deque容器对象,并且通过模板参数指定容器中存放的数据的类型
	deque<int> d;

	// push_back()向容器尾部插入数据
	d.push_back(80);
	d.push_back(20);
	d.push_back(40);
	d.push_front(10);
	d.push_front(90);
	d.push_front(50);

	Fun_Print(d);  // 50 90 10 80 20 40

	// sort()排序;默认排序规则,从小到大,升序
	// 对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序;vector容器也可以利用sort进行排序
	sort(d.begin(), d.end());
	Fun_Print(d);  // 10 20 40 50 80 90
}

int main() {

	test();

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

在这里插入图片描述


总结

(1)、deque 容器和 vector 容器的构造方式几乎一致,灵活使用即可;

(2)、deque 赋值操作也与 vector 相同;

(3)、deque 没有容量的概念;

(4)、deque 判断是否为空 — empty;

(5)、deque 返回元素个数 — size;

(6)、deque 重新指定个数 — resize;

(7)、deque 插入和删除提供的位置是迭代器!

(8)、deque尾插 — push_back;

(9)、deque 尾删 — pop_back;

(10)、deque 头插 — push_front;

(11)、deque 头删 — pop_front;

(12)、除了用迭代器获取deque容器中元素,[ ]和at也可以;

(13)、front() 返回容器第一个元素;

(14)、back() 返回容器最后一个元素;

(15)、sort() 算法非常实用,使用时包含头文件 algorithm即可。

你可能感兴趣的:(c++,算法,开发语言)