STL之deque

5 篇文章 1 订阅

写在前面

双向队列deque, 支持快速随机访问, 可在队头队尾执行插入删除操作.

	//需导入头文件
	#include <deque>

构造

	deque<string> dq;	//默认构造, 构造一个空的deque

	deque<int> dq1{ 1, 2,3 };	//构造有三个整数的deque
	//deque<int> dq1 = { 1, 2, 3 };	//同上

	deque<int> dq2(10, 6);	//构造一个10个元素大小的deque, 10个元素值均为6

	deque<int> dq3(dq1);	//拷贝构造

	deque<int> dq4 = dq3;	//赋值构造

	deque<int> dq5(dq4.begin(), dq4.end());	//拷贝指定范围的值来构造dq5

赋值

	deque<int> dq{1, 2, 3};
	deque<int> dq1(10, 6);
	
	//赋值
	deque<int> dq2 = dq;	//重载的=运算符

	//assign成员函数的三个重载版本示例
	deque<int> dq3;
	dq3.assign(initializer_list<int>{1, 2, 3, 4, 5});
	dq3.assign(6, 2);
	dq3.assign(dq1.begin(), dq1.end());

	//swap成员函数: 交换两个deque元素
	dq3.swap(dq2);

deque只有一个size成员, 而不会像vector那样还有一个capacity容量成员.

访问

下标运算符[]

	deque<int> dq = { 1, 2, 3 };
	int nVal = dq[1];	//返回2, 因为已经知道类型为int, 因此这里可以使用int型变量接收
	deque<int>::value_type nVal = dq[0];	//声明时需要指定类型, 岂不是脱裤子放屁?

at成员函数

返回对 deque 中指定位置的元素的引用.

唯一的一个参数为要引用 deque的元素的下标.

deque<string> dq{ "1", "12", "123" };
string sVal = dq.at(2);	//返回字符串"123"

front成员函数

返回对 deque 中第一个元素的引用.

如果为 deque 空,则返回为未定义, 成员抛出异常终止.

	deque<int> dq{ 1, 2, 3};
	int nVal = dq.front();	//返回1

back成员函数

返回对 deque 中最后一个元素的引用.

同front, 如果为 deque 空,则返回值未定义.

	deque<int> dq{ 1, 2, 3};
	int nVal = dq.back();	//返回3

大小操作

size, empty, resize成员函数

	deque<int> dq{1, 2, 3};
	deque<int> dq1(10, 6);
	
	//size成员函数, 返回当前deque容器大小, 返回类型依旧是deque<T>::size_type
	deque<int> dq{ 1, 2, 3 };
	deque<int> dq1(10, 6);

	deque<int>::size_type nSize = dq.size();
	
	//empty成员函数
	if ( dq1.empty() )
	{
		//dq1容器为空
	}
	else
	{
		//dq1容器不为空
	}

	//resize成员函数
	dq.resize(10);
	dq1.resize(5, 1);

插入删除

deque只能在队头队尾进行插入删除操作.

push_back, pop_back成员函数

队尾增删

	deque<int> dq{ 1, 2, 3 };
	dq.push_back(4);	//{ 1, 2, 3, 4 }
	dq.pop_back();		//{ 1, 2, 3 }, 对空deque调用pop_back会抛出异常终止

push_front, pop_front成员函数

	deque<string> dq{ "1", "12", "123" };
	dq.push_front("0");
	dq.pop_front();			//对空deque调用pop_front会抛出异常终止

erase成员函数

从指定位置删除 deque 中一个或一系列元素.

需要注意的是该函数的参数和返回值均为迭代器.

函数原型如下:

	iterator erase(iterator _Where);
	
	iterator erase(iterator first, iterator last);
	
	//参数
	//_Where: 要从中 deque移除的元素的位置。
	//first: 从中删除 deque的第一个元素的位置。
	//last: 位置刚好超出从中删除的最后一 deque个元素, 即最后一个删除元素的后一个位置。
	//返回值: 一个随机访问迭代器,指定除删除的任何元素之外剩余的第一个元素,或者指定指向不存在此类元素的末尾的 deque 指针。
	deque<int> dq{ 1, 2, 3, 4, 5 };
	deque<int>::iterator it = dq.erase(dq.begin(), dq.begin() + 4);		//it指向5
	deque<int>::iterator it2 = dq.erase(dq.begin(), dq.end());	//it == dq.end()

insert成员函数

将一个元素或多个元素或一系列元素插入 deque 到指定位置.

注意的是该函数的位置参数和返回值均为迭代器.

函数原型:

	iterator insert(
	    const_iterator Where,
	    const Type& Val);
	
	iterator insert(
		iterator Where, 
		initializer_list<Type>IList);
		
	void insert(
	    iterator Where,
	    size_type Count,
	    const Type& Val);
	
	//参数
	//Where: 插入第一个元素的目标 deque 位置
	//Count: 要插入到的 deque元素数
	//Val: 插入到 deque 中的元素的值
	//IList: 插入的初始化列表对象
	//返回值: 前两个插入函数返回一个迭代器,该迭代器指向插入新元素 deque的位置
	deque<int> dq;
	deque<int>::iterator it = dq.insert(dq.begin(), 1);		//it指向第一个元素
	deque<int>::iterator it2 = dq.insert(dq.begin() + 1, 2, 6);	//it2指向第二个元素
	deque<int>::iterator it3 = dq.insert(dq.begin() + 3, initializer_list<int>{5, 5, 5}); //it3指向第四个元素

clear成员函数

清除 deque 的所有元素。

	deque<int> dq{ 6, 6, 6 };
	dq.clear();
	deque<int>::size_type nSize = dq.size();		//返回0

遍历

	//普通for循环
	cout << "-----普通for循环-----\n";
	for (deque<int>::size_type i = 0; i < dq.size(); i++)
	{
		cout << dq[i] << endl;
	}
	cout << "-----End 普通for循环-----\n\n";

	//范围for循环
	cout << "-----范围for循环-----\n";
	for (auto val : dq)
	{
		cout << val << endl;
	}
	cout << "-----End 范围for循环-----\n\n";

	//迭代器遍历
	cout << "-----迭代器遍历-----\n";
	for (deque<int>::iterator it = dq.begin(); it != dq.end(); it++)
	{
		cout << *it << endl;
	}
	cout << "-----End 迭代器遍历-----\n\n";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值