返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++deque与vector对比的优缺点
  • 957
分享到

C++deque与vector对比的优缺点

C++deque与vector优缺点C++deque与vector 2023-01-04 12:01:04 957人浏览 薄情痞子
摘要

目录deque容器deque的迭代器deque的成员函数deque容器 deque的相关文档 deque与vector十分的相识。vector是单向开口的连续线性空间(单向扩容),d

deque容器

deque的相关文档

deque与vector十分的相识。vector是单向开口的连续线性空间(单向扩容),deque则是一种双向开口的连续线性空间(双向扩容)。双向开口:可以在头尾两端分别做元素的插入和删除操作。区别就在此,vector当然也可以在头尾两端进行操作,但是其头部操作的效率奇差,无法被接受,如:stack与queue的容量适配器就在二者其中,选择deque(当然使用vector也可)。

vector与deque的差异:

  • deque允许于常数时间内对头端进行元素的插入或移除操作。
  • deque没有所谓的容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并连接起来。

与stack相比deque的优缺点:

优势:

  • 头尾插入删除很方便

劣势:

  • operator[]计算稍显复杂,大量使用,性能下降(下标需要经过计算)。
  • 中间插入删除效率不高(下标需要经过计算,并且需要挪动元素)。
  • 底层角度迭代器会很复杂。

结论:

  • 头尾的插入删除deque非常适合,相比vector而言,很适合去做stack和queue的默认适配容器。
  • 中间插入删除少用deque,可以用:list(因为无需挪动元素)。
  • 随机访问多用vector(因为下标是确定的)。

deque的迭代器

需要注意,deque是连续的空间,但是这只是其逻辑上的,物理上并不是。所以在迭代器上维持其“整体连续”假象的工作,就落在迭代器中的operator++与operator--上了。

首先,连续重要的就是能够指出分段空间在哪里,其次,它必须能够判断自己是否已经处于其所在的存储边缘,如果是,一旦前行或后退时就必须跳跃到下一个或上一个存储空间。

// __deque_iterator的源码
template <class T, class Ref, class Ptr, size_t BufSiz>
struct __deque_iterator
{
	typedef __deque_iterator<T, T&, T*>             iterator;
	typedef __deque_iterator<T, const T&, const T*> const_iterator;
	static size_t buffer_size() {return __deque_buf_size(0, sizeof(T)); }//buffer_size()用于确定缓冲区的大小
	typedef random_access_iterator_tag iterator_cateGory;
	typedef T value_type;
	typedef Ptr pointer;
	typedef Ref reference;
	typedef size_t size_type; // size_t 是unsigned 类型,通常用来指明数组长度
	typedef ptrdiff_t difference_type; // ptrdiff_t 是 signed 整型,通常用来保存两个指针减法操作的结果
	typedef T** map_pointer;
	typedef __deque_iterator self;
	// 保持与容器的联结,是对某一个缓冲区而言的
	T* cur;       // 此迭代器所指之缓冲区中的现行元素
	T* first;     // 此迭代器所指之缓冲区的头
	T* last;      // 此迭代器所指之缓冲区的尾(含备用空间)
	map_pointer node;    // 指向管控中心
        ...
}
//deque_buf_size()全局函数
inline size_t deque_buf_size(size_t n, size_t sz){
    return n != 0 ? n : (sz < 512 ? size_t(512 / sz) : size_t(1));
}
//定义:
//1. 如果n不为0,传回n,表示buffer size由使用者自定。
//2. 如果n为0,表示buffer size使用默认值,那么:
//    如果sz不小于 512,返回1。
//    如果sz(元素大小,sizeof(value_type))小于512,传回512/sz。

void set_node(map_pointer new_node) {
	node = new_node;
	first = *new_node;
	last = first + difference_type(buffer_size());
}
reference operator*() const { return *cur; }
pointer operator->() const { return &(operator*()); }
difference_type operator-(const self& x) const {
	return difference_type(buffer_size()) * (node - x.node - 1) + (cur - first) + (x.last - x.cur);
}
self& operator++() {
	++cur;        //切换至下个元素
	if (cur == last) {   //如果已达所在缓冲区的尾端,就切换至下一节点(亦即缓冲区)的第一个元素
		set_node(node + 1);
		cur = first;
	}
	return *this;
}
self operator++(int) { //后置式,标准写法
	self tmp = *this;
	++*this;
	return tmp;
}
self& operator--() {
	if (cur == first) {//如果已达所在缓冲区的头端, 就切换至前一节点(亦即缓冲区)的最后一个元素
		set_node(node - 1);
		cur = last;
	}
	--cur; //切换至前一个元素
	return *this;
}
self operator--(int) { //后置式,标准写法
	self tmp = *this;
	--*this;
	return tmp;
}
// 以下实现随机存取。迭代器可以直接跳跃n个距离
self& operator+=(difference_type n) {
	difference_type offset = n + (cur - first);
	if (offset >= 0 && offset < difference_type(buffer_size()))
		//标的位置在同一缓冲区内
		cur += n;
	else {
		//标的位置不在同一缓冲区内
		difference_type node_offset =
			offset > 0 ? offset / difference_type(buffer_size()) : -difference_type((-offset - 1) / buffer_size()) - 1;
		// 切换至正确的节点(亦即缓冲区)
		set_node(node + node_offset);
		// 切换至正确的元素
		cur = first + (offset - node_offset * difference_type(buffer_size()));
	}
	return *this;
}
self operator+(difference_type n) const {
    self tmp = *this;
    return tmp += n; //调用operator+=
}
//利用operator+=完成operator-=
self& operator-=(difference_type n) { return *this += -n; }
self operator-(difference_type n) const {
    self tmp = *this;
    return tmp -= n; //调用operator-=
}
//实现随机存取,迭代器可以直接跳跃n个距离
reference operator[] (difference_type n) const { return * (*this + n);)}
bool operator==(const self& x) const { return cur == x.cur; }
bool operator!=(const self& x) const { return !(*this == x); }
bool operator<(const self& x) const {
    return (node == x.node) ? (cur < x.cur) : (node < x.node);
}

deque的成员函数

函数成员函数功能
begin()返回指向容器中第一个元素的迭代器。
end()返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
rbegin()返回指向最后一个元素的迭代器。
rend()返回指向第一个元素所在位置前一个位置的迭代器。
cbegin()和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin()和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend()和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
size()返回实际元素个数。
max_size()返回容器所能容纳元素个数的最大值。这通常是一个很大的值,一般是 232-1,我们很少会用到这个函数。
resize()改变实际元素的个数。
empty()判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
shrink _to_fit()将内存减少到等于当前元素实际所使用的大小。
at()使用经过边界检查的索引访问元素。
front()返回第一个元素的引用。
back()返回最后一个元素的引用。
assign()用新元素替换原有内容。
push_back()在序列的尾部添加一个元素。
push_front()在序列的头部添加一个元素。
pop_back()移除容器尾部的元素。
pop_front()移除容器头部的元素。
insert()在指定的位置插入一个或多个元素。
erase()移除一个元素或一段元素。
clear()移出所有的元素,容器大小变为 0。
swap()交换两个容器的所有元素。
emplace()在指定的位置直接生成一个元素。
emplace_front()在容器头部生成一个元素。和 push_front() 的区别是,该函数直接在容器头部构造元素,省去了复制移动元素的过程。
emplace_back()在容器尾部生成一个元素。和 push_back() 的区别是,该函数直接在容器尾部构造元素,省去了复制移动元素的过程。

到此这篇关于c++ deque与vector对比的优缺点的文章就介绍到这了,更多相关C++ deque与vector内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++deque与vector对比的优缺点

本文链接: https://lsjlt.com/news/176667.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++deque与vector对比的优缺点
    目录deque容器deque的迭代器deque的成员函数deque容器 deque的相关文档 deque与vector十分的相识。vector是单向开口的连续线性空间(单向扩容),d...
    99+
    2023-01-04
    C++ deque与vector优缺点 C++ deque与vector
  • golang函数的优点与缺点对比
    go 函数的优点包括:提高代码可重用性、模块化、封装性、可测试性和并发性;缺点包括:代码重复、命名冲突、性能开销、复杂性和调试困难。通过计算矩形面积的示例展示了函数的优点,包括提高代码可...
    99+
    2024-04-19
    golang 优缺点 封装性
  • C++ 函数与宏的区别和优缺点对比
    函数是运行时执行的代码块,可返回结果;宏是预处理时展开的常量或代码片段,不可返回结果。函数易读、可重用、代码可读性高,但效率低;宏编译开销小、性能优,但代码可读性差、难以调试。 C++...
    99+
    2024-04-11
    函数 c++ 作用域 代码可读性
  • golang函数的优点对比缺点?
    go 函数具有可复用性、封装性、测试性和并发性等优点,同时也有可变性、计算开销和缺乏类型推断等缺点。它在分布式系统、微服务和云计算等领域广泛应用,通过将代码分组为可重用的单元,简化了开发...
    99+
    2024-04-20
    golang 优缺点 封装性
  • Docker和containerd的优缺点对比
    今天就跟大家聊聊有关Docker和containerd的优缺点对比,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。containerd简介containerd是一个工业级标准的容器运行...
    99+
    2023-06-06
  • 探究Go语言与GoJS的优缺点对比
    Go语言和GoJS分别代表了编程语言和JavaScript库的两种类型,它们分别在不同领域发挥着重要作用。本文将探究这两者的优缺点,并通过具体的代码示例进行对比。 Go语言(Golan...
    99+
    2024-04-02
  • Solr与Elasticsearch的优缺点比较
    这篇文章主要讲解了“Solr与Elasticsearch的优缺点比较”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Solr与Elasticsearch的优缺...
    99+
    2024-04-02
  • java中继承的优缺点对比
    这篇文章将为大家详细讲解有关java中继承的优缺点对比,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实...
    99+
    2023-06-14
  • Golang函数库的优缺点对比
    golang 标准库的函数库各有优缺点,了解差异很重要。fmt 函数库提供格式化输出,但控制有限;log 函数库记录日志,但无自定义级别;regexp 函数库处理正则表达式,但性能受限;...
    99+
    2024-04-18
    golang 函数库 格式化输出 标准库
  • 网站优化方面的优缺点对比
    网站优化方面的优缺点对比?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。分页在网络上面的应用我们使用这种类型的分页功能将足够丰富的内容分成几页。我们发现电子商务网站的产品列表通常...
    99+
    2023-06-10
  • PHP框架的比较:优缺点详细对比
    最佳 php 框架选择:laravel:全功能、高效 orm、活跃社区(适用于大型项目)codeigniter:轻量级、可扩展、易于理解(适用于小型项目)symfony:组件化、行业标准...
    99+
    2024-05-23
    框架 php laravel
  • C++ 函数参数传递方法的优缺点对比
    c++++函数参数传递分为值传递和引用传递,值传递不会修改函数中变量,优点是低内存消耗,缺点是针对大数据结构复制开销大。引用传递优点是避免了大数据结构的复制开销,缺点是可能修改调用函数中...
    99+
    2024-04-13
    c++ 函数参数 引用传递 值传递
  • mongodb对比mysql的优缺点是什么
    本文主要给大家简单讲讲mongodb对比mysql的优缺点是什么,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mongodb对比mysql的优缺点是什么这篇...
    99+
    2024-04-02
  • java中线程池的优缺点对比
    这篇文章将为大家详细讲解有关java中线程池的优缺点对比,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;...
    99+
    2023-06-14
  • 对象存储服务与图片服务器的优缺点对比
    今天再次与人探讨到网站图片存放话题,于是乎想起了经典的图片存放的虚拟应用程序。也就是IIS发布时候的“添加虚拟目录”功能。此功能如今在图片共享用途上已经逐步被对象存储服务所替代。这个功能在传统架构里,虚拟目录功能能够实现多个网站共享同一个“...
    99+
    2023-06-05
  • 服务器容器与虚拟机的优缺点大对比
    优点: 隔离性: 每台 VM 都是一个独立的服务器环境,具有自己的操作系统、应用程序和数据。这提供了很强的安全性和隔离性。 硬件兼容性: VM 与物理服务器运行相同的操作系统和应用程序,因此可以轻松迁移并与现有基础设施集成。 管理简单:...
    99+
    2024-04-02
  • golang函数与goroutine的优缺点比较
    函数用于顺序执行任务,简单易用,但存在阻塞和资源受限问题。goroutine 是并发执行任务的轻量级线程,具有高并发性、可伸缩性和事件处理能力,但使用复杂,开销较大,且难以调试。在实战中...
    99+
    2024-04-25
    golang 同步机制
  • python中K-NN算法优缺点对比
    python中K-NN算法优缺点对比?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多...
    99+
    2023-06-14
  • Go语言与Java在开发效率方面的比较:优缺点对比
    Go语言和Java在开发效率上的不同:优势与劣势 概述 Go语言和Java都是广受欢迎的编程语言,它们都有自己的优点和缺点。在开发效率方面,Go语言和Java也有着不同的表现。 Go语言的优势 简单易学:...
    99+
    2024-01-31
    java go语言 - 性能 - 并发性 - 静态类型 跨平台应用
  • 自建服务器与阿里云优缺点对比分析
    在信息化时代,服务器已经成为企业或个人进行数据存储、数据处理、信息交互的重要工具。自建服务器与阿里云作为两种常见的服务器形式,各有其独特的优点和缺点。本文将对自建服务器与阿里云进行详细的优缺点对比分析,以帮助读者更好地选择适合自己的服务器形...
    99+
    2023-11-22
    阿里 优缺点 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作