0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

c++值deque容器

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2023-07-14 08:49 次阅读

1.deque容器介绍

deque 是 double-ended queue 的缩写,又称双端队列容器。deque容器支持从头部和尾部双端插入、删除数据。与vector容器不同的是,vector容器是一段连续的空间,而deque没有所谓容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并连接起来。不会像vector那样,因为空间不足而扩容,复制元素到新的空间,再释放旧的空间。因此deque没有必要提供所谓的扩容(reserve)的功能。

wKgaomSwlVeABkc8AATxtQagCLQ587.png

deque容器可以看做是一个双端数组,可以从头或者尾之间插入数据。从头插入或者删除使用push_front和pop_front。从尾插入或删除输出使用push_backh和pop_back。从任意位置插入可以使用insert函数。

deque容器,在空间管理上是通过内部中控器来实现的。中控器记录每一个缓冲区的地址。缓冲区中存放真实的数据内容。因而在deque容器中,数据空间是由多段空间组成的。

deque容器是没有预留空间函数reserve和获取容量大小函数capacity。

deque从头端插入数据比vector容器快,而且数据量越大越明显。

wKgZomSwljqAG_uXAARxbhSzBNw535.png

2.deque容器构造函数

deque容器的构造函数和vector类似,由无参构造、有参构造、拷贝构造。

deque构造函数:
	deque() --无参构造
	deque(begin,end);//有参构造,将begin~end之间的数据拷贝
	deque(int count,elem);//count个elem数据
	deque(deque &p);//拷贝构造

应用示例:

#include < iostream >
using namespace std;
#include < deque >
#include < algorithm >
void PrintDeque(const deque< int >& p)
{
	for (deque< int >::const_iterator deq = p.begin(); deq != p.end(); deq++)
	{
		cout < < *deq < < " ";
	}
	cout < < endl;
}
void Print(int val)
{
	cout < < val < < " ";
}
void test()
{
	//创建一个deque容器
	deque< int > deq;
	//插入数据:尾插
	deq.push_back(1);
	deq.push_back(2);
	deq.push_back(3);
	//插入数据:头插
	deq.push_front(4);
	deq.push_front(5);
	deq.push_front(6);
	cout < < "第一个数据:" < < deq.front() < < endl;
	cout < < "最后一个数据:" < < deq.back() < < endl;
	cout < < "遍历:" < < endl;
	PrintDeque(deq);
	cout < < "for_each逆向遍历:" < < endl;
	for_each(deq.rbegin(), deq.rend(), Print);
	cout < < endl;
	cout < < "有参构造:" < < endl;
	deque< int > deq2(deq.rbegin(), deq.rend());//区间赋值
	PrintDeque(deq2);
	deque< int > deq3(3, 666);//赋值3个666
	PrintDeque(deq3);
	cout < < "拷贝构造:"< < endl;
	deque< int > deq4(deq);//拷贝构造
	PrintDeque(deq4);
}
int main()
{
	test();
	system("pause");
}
wKgaomSwl_uAGNf4AAOosi5FoJY681.png

3.deque容器赋值

赋值方式可以直接使用“=”赋值,也可以通过函数assign实现。

deq赋值:
	重载"=":operator=();
	assign(begin,end);//区间赋值
	assign(int count,elem);//count个elem

使用示例:

include < iostream >
#include < deque >
using namespace std;

void PrintDeque(const deque< int >& p)
{
	for (deque< int >::const_iterator deq = p.begin(); deq != p.end(); deq++)
	{
		cout < < *deq < < " ";
	}
	cout < < endl;
}
void test()
{
	deque< int > deq;
	//尾插
	deq.push_back(1);
	deq.push_back(2);
	deq.push_back(3);
	//头插
	deq.push_front(4);
	deq.push_front(5);
	deq.push_front(6);
	cout < < "deq 直接插入" < < endl;
	PrintDeque(deq);
	deque< int > deq2 = deq;//之间赋值
	cout < < "deq2 =赋值" < < endl;
	PrintDeque(deq2);
	cout < < "deq3 区间赋值" < < endl;
	deque< int > deq3;
	deq3.assign(deq.begin(), deq.end());
	PrintDeque(deq3);

}
int main()
{
	test();
	system("pause");
}

wKgZomSwmHKAQmzVAAPbv3KEPss788.png

4.deque设置和获取元素个数

判断容器是否为空可以使用empty()函数,设置元素个数可以使用resize()函数,获取元素个数使用size()函数。


deque容器获取大小:
	判断容器是否为空:empty()  ---为空返回true
	获取容器元素个数:size()  
	指定容器大小:resize(int num);
				 resize(int num,elem);//指定大小,超出部分用elem填充
	resize指定大小,若小于则会将超出部分删除
注意:
	deque容器没有获取容量函数capacity()	

使用示例:

#include < iostream >
using namespace std;
#include < deque >
void PrintDeque(deque< string >& p)
{
	for (deque< string >::iterator deq = p.begin(); deq != p.end(); deq++)
	{
		cout < < *deq < < " ";
	}
	cout < < endl;
}
void test()
{
	deque< string > deq;
	deq.push_back("hello");
	deq.push_back("学习");
	deq.push_back("c++");
	deq.push_back("deque容器");
	deq.push_back("使用");
	deq.push_back("示例");
	PrintDeque(deq);
	cout < < "元素个数:" < < deq.size() < < endl;
	deq.resize(10,"c++");//指定个数,剩余填充"c++";
	PrintDeque(deq);
	deq.resize(3);
	PrintDeque(deq);
	cout < < "元素个数:" < < deq.size() < < endl;
}
int main()
{
	test();
	system("pause");
}
wKgaomSwmVaAR6_cAARyN4aZjqI875.png

5.deque元素的插入与删除

deque容器是双端性质的,所以可以从头端或者尾端插入数据。相关函数如下:


deque容器插入与删除:
	push_back、pop_back  --尾插和尾删
	push_front、pop_front --头插和头删除
	
	insert(pos,elem); --pos是一个迭代器,在pos位置插入elem,返回新数据位置
	insert(pos,n,elem);  ---在pos位置插入n个elem,无返回值
	insert(pos,begin,end); --在pos位置插入begin~endl的数据,无返回值
	
	clear()  --清空整个deque容器
	erase(begin,end); --删除begin~end之间的数,返回下一个数据位置
	erase(pos)  --删除指定位置的数

使用示例:

#include < iostream >
using namespace std;
#include < deque >
void PrintDeque(deque< int >& deq)
{
	for (deque< int >::iterator p = deq.begin(); p != deq.end(); p++)
	{
		cout < < *p < < " ";
	}
	cout < < endl;
}
void test()
{
	deque< int > deq;
	//头插
	deq.push_front(1);
	deq.push_front(2);
	deq.push_front(3);
	//尾插
	deq.push_back(4);
	deq.push_back(5);
	deq.push_back(6);
	cout < < "t插入数据示例:" < < endl;;
	PrintDeque(deq);
	deq.pop_back();//尾删
	deq.pop_front();//头删
	cout < < "t删除数据示例:" < < endl;;
	PrintDeque(deq);
	cout < < "tinsert插入数据示例:" < < endl;
	deq.insert(deq.begin() + 2, 666);//在起始的第二个位置插入666
	deq.insert(deq.begin() + 5, 3, 888);//在起始的第5个位置插入三个888
	PrintDeque(deq);
	deque< int > deq2;
	cout < < "tinsert区间插入数据示例:" < < endl;
	deq2.insert(deq2.begin(), deq.begin() + 5, deq.begin() + 8);//在deq2的起始位置插入deq的第5~8个位置的数
	PrintDeque(deq2);
	//删除数据
	cout < < "指定位置删除:" < < endl;
	deq.erase(deq.begin() + 2);//删除第2个位置的数
	PrintDeque(deq);
	cout < < "指定区间删除:" < < endl;
	deq.erase(deq.begin() + 3, deq.begin() + 6);//删除第3~6位置上的数
	PrintDeque(deq);
	cout < < "清空:" < < endl;
	deq2.clear();
	PrintDeque(deq2);
}
int main()
{
	test();
	system("pause");
}
wKgZomSwmiGAT0foAAWEr2f-erI565.png

6.deque容器数据存取

deque可以通过[]读写数据,也可以通过函数at()来实现。

deque容器数据存取:
	重载[]:operator[]()
	at(pos);
	获取第一个成员:front
	获取最后一个成员:back
	第一个成员的前一个位置:rend
	最后一个成员的下一个位置:end

使用示例:

#include < iostream >
using namespace std;
#include < deque >
#include < algorithm >
void test()
{
	deque< string > deq;
	deq.push_back("hello");
	deq.push_back("c++");
	deq.push_back("学习");
	deq.push_back("示例");

	cout < < "最后一个成员:" < < deq.back() < < endl;
	cout < < "第一成员:" < < deq.front() < < endl;
	cout< <"遍历:"< ;>
wKgaomSwmsSAbq-wAANnbZfJDjQ353.png

7.排序

可以使用sort函数对成员进行排序。该函数的头文件是algorithm。

排序:sort(iterator begin,iterator end);//默认是升序 

使用示例:

#include < iostream >
#include < string >
#include < algorithm >
#include < deque >
using namespace std;

void test()
{
	string str = "hello,world";
	sort(str.begin(), str.end());
	cout < < str < < endl;
	deque< int > deq;
	deq.push_back(0);
	deq.push_back(2);
	deq.push_back(1);
	deq.push_front(4);
	deq.push_front(5);
	deq.push_front(6);
	cout < < "原内容:" < < endl;
	for (int i = 0; i < deq.size(); i++)
	{
		cout < < deq[i] < < " ";
	}
	cout < < endl;
	cout < < "排序后:" < < endl;
	sort(deq.begin(), deq.end());
	for (int i = 0; i < deq.size(); i++)
	{
		cout < < deq[i] < < " ";
	}
	cout < < endl;
	cout < < "数组排序:" < < endl;
	int buff[] = { 1,2,3,6,4,0,8,7,2 };
	sort(buff, buff+ sizeof(buff) / sizeof(int));
	for (int i = 0; i < sizeof(buff) / sizeof(int); i++)
	{
		cout < < buff[i] < < " ";
	}
}
int main()
{
	test();
	system("pause");
}
wKgaomSwm5OAc2YOAAPtMyHiIW0296.png


审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4306

    浏览量

    62430
  • 容器
    +关注

    关注

    0

    文章

    494

    浏览量

    22044
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73494
收藏 人收藏

    评论

    相关推荐

    C++零基础教程STL容器篇之deque容器,轻松上手C++STL

    编程语言C++语言
    电子学习
    发布于 :2023年01月14日 11:41:55

    HarmonyOS方舟开发框架容器类API的介绍与使用

    通过数组实现,包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七种。线性容器类API,充分考虑了数据访问的速度,实现了运行时(Runtime)通过
    发表于 03-07 11:40

    HarmonyOS线性容器特性及使用场景

    线性容器实现能按顺序访问的数据结构,其底层主要通过数组实现,包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七种。 线性容器,充分考虑了数据
    发表于 09-27 15:10

    详细剖析C++的的3种容器

    容器是随着面向对象语言的诞生而提出的,容器类在面向对象语言中特别重要,甚至它被认为是早期面向对象语言的基础。在现在几乎所有的面向对象的语言中也都伴随着一个容器集,在C++ 中,就是标准
    的头像 发表于 01-09 12:57 4921次阅读
    详细剖析<b class='flag-5'>C++</b>的的3种<b class='flag-5'>容器</b>

    C++ vector删除符合条件元素的编程技巧

    C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法。 C++ 中std::remove()并不删除元素,因为容器的size()没有
    的头像 发表于 09-20 10:03 5385次阅读

    C++容器的使用代码资料总结免费下载

    本文档的主要内容详细介绍的是C++容器的使用代码资料总结免费下载。
    发表于 01-29 10:52 3次下载
    <b class='flag-5'>C++</b><b class='flag-5'>容器</b>的使用代码资料总结免费下载

    CC++是一回事吗

    C89,C++标准是C++99。 我们来介绍C语言和C++中那些不同的地方。 函数默认
    的头像 发表于 11-13 18:18 3256次阅读

    夜空中最亮的星——deque容器

    一、deque工作原理:deque容器内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据;中控器维护的每个缓冲区的地址,使得使用deque时像一片连续的内存空间,如下图所示:
    的头像 发表于 12-24 14:42 381次阅读

    什么是deque

    双端队列(deque)和deque一样都是STL的容器deque是双端数组,而deque是单端的。跟任意其它类型
    的头像 发表于 02-27 15:53 1891次阅读

    C++学习笔记之顺序容器

    C++中的顺序容器是一种用于存储和管理元素序列的数据结构。它们提供了一组有序的元素,并支持在序列的任意位置插入和删除元素。C++标准库中提供了多种顺序容器,包括vector、
    的头像 发表于 05-11 17:05 565次阅读

    C++入门之通用算法

    C++ 是一种强大的编程语言,它提供了许多通用算法,可以用于各种容器类型。这些算法是通过迭代器来操作容器中的元素,因此它们是通用的,可以用于不同类型的容器。在本篇博客中,我们将详细介绍
    的头像 发表于 05-17 09:40 631次阅读

    ​数组和C++ std::array详解

    std::array是C++容器库提供的一个固定大小数组的容器。其与内置的数组相比,是一种更安全、更容易使用的数组类型。
    的头像 发表于 07-19 11:02 1044次阅读
    ​数组和<b class='flag-5'>C++</b> std::array详解

    C++之父新作带你勾勒现代C++地图

    为了帮助大家解决这些痛点问题,让大家领略现代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他亲自操刀写就了这本《C++之旅》!
    的头像 发表于 10-30 16:35 794次阅读
    <b class='flag-5'>C++</b>之父新作带你勾勒现代<b class='flag-5'>C++</b>地图

    OpenHarmony语言基础类库【@ohos.util.Deque (线性容器Deque)】

    Deque(double ended queue)根据循环队列的数据结构实现,符合先进先出以及先进后出的特点,支持两端的元素插入和移除。Deque会根据实际需要动态调整容量,每次进行两倍扩容。
    的头像 发表于 04-25 21:17 196次阅读
    OpenHarmony语言基础类库【@ohos.util.<b class='flag-5'>Deque</b> (线性<b class='flag-5'>容器</b><b class='flag-5'>Deque</b>)】

    鸿蒙语言基础类库:ohos.util.Deque 线性容器Deque

    Deque(double ended queue)根据循环队列的数据结构实现,符合先进先出以及先进后出的特点,支持两端的元素插入和移除。Deque会根据实际需要动态调整容量,每次进行两倍扩容。
    的头像 发表于 07-10 09:19 210次阅读
    鸿蒙语言基础类库:ohos.util.<b class='flag-5'>Deque</b> 线性<b class='flag-5'>容器</b><b class='flag-5'>Deque</b>