在 vector , map , list 间取得平衡

C++最经典的三大容器Vector、Map、List C++中的容器可以分为好多种,常见的有顺序容器:向量(vector)、双端队列(deque)、列表(list)。还有关联容器:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。容器有太多,下面就来讲讲用得到也最常用的三种容器vector、list、map。 第一种:Vector容器 示意图: 特点: 地址不变,内存空间连续,所以在中间进行插入和删除时会造成内存块拷贝,如果插入的是结构体或者类,则会造成构造和析构,性能不是特别高,对结尾元素操作最快。 下 阅读详情
在 vector , map , list 间取得平衡

来自:[http://www.codingnow.com/2004/board/view.php?paster=776]

我想做一个数据结构,可以有序的存放数据,方便查找,而插入数据效率又不会太低。

当数据几乎不变 vector 是最好的解决方案。我们只需要把数据放进去,sort 之后,用 binary_search 就 ok 了。

如果经常插入数据,我们不得不考虑用 list ,这样可以达到最快的插入速度,但实在不利于检索。

map 是许多程序员的最爱,stl 的 map 多用 RB tree 来实现。有着快速的插入速度,同时具有媲美二分查找的查找速度。不过它需要记录很多额外的信息,三个指针和一个颜色值。而且,map 的插入效率还是另人担忧。

云风在这里提出一种数据结构仅供参考:

我希望用一种散开的数组来保存有序的数据,物理上线形的数据来保证其可以被二分查找,而一些离散的性质可以让插入操作不会去做大量的数据移动。我希望看到的数据在内存中保存的状态如下:

X....X........XX...X.............X

我们把 X 看作数据,“." 看作冗余信息。无论实际数据还是冗余数据都是等长的,线形分布在内存。我们可以用 vector 在实现。当然我们需要用 1bit 来区分数据的类型,这个 bit 不需要单独记录,大多数情况下都可以借用数据本身。例如,如果数据节点中有一个字是有效指针,我们可以用空指针来表明这个节点是一个冗余节点。

然后我们在冗余节点中放上偏移量来关联离散的节点:

X....X 变成 X 4 -2 -3 -4 X 中间的数字偏移量表示了离该节点最近的数据节点的位置。有了这些信息,我们就可以方便的做二分查找了。

至于插入节点,如果有冗余节点,我们可以替换掉它,如果没有则需要向前或向后移动,但移动量一般比密集的数组要小。

详细的算法不再给出,本文仅仅记录一下突然的灵感。

 

没有仔细考虑该算法,权当可行,先摘录下来,将来用时再做考虑!

C++STL中list, vector, map, set用法与区别 List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。 Vector与list Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。 List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要... 阅读详情

相关推荐

C++ 容器对比汇总 vector deque list forward_list map set multimap unordered_map

【代码】C++ 容器 vector deque list forward_list map set multimap unordered_map 等访问插入性能内存特点存储结构适用场景区别汇总。

不经一番寒彻骨,怎得梅花扑鼻香。 1372

c++ 工程基础之STL系列 (二) list

list内部数据结构是一个双向循环链表,这样的数据结构在插入和删除上的时间复杂度相对vector会更好些,但是其两个指针占用的内存会更大一些 list在实际工程中主要应用在大量的插入和删除操作的场景,例如缓存淘汰LRU算法就可以用list实现。

实践是检验真理的唯一标准 757

STL中基本容器string、vector、list、deque、set、map之间的区别

STL中基本容器string、vector、list、deque、set、map之间的区别

dvlinker的技术专栏 1153

STL中Vector和List的底层数据结构

摘要:本文列出几个基本的STL map和STL set的问题,通过解答这些问题讲解了STL关联容器内部的数据结构,最后提出了关于UNIX/LINUX自带平衡二叉树库函数和map, set选择问题,并分析了map, set的优势之处。对于希望深入学习STL和希望了解STL map等关联容器底层数据结构的朋友来说,有一定的参考价值。 vector(向量)——STL中标准而安全的数组。只能在ve...

weixin_30739595的博客 253

C++ STL教程(2) 容器简介

1 什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对 象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处, 就是“容器类是一种对特定代码重用问题的良好的解决方案”。 容器还有另一个特点是容器可以自行扩展。在解决问题时我们常常不知道我们需要存储多少个对象,也就是说我们不知

二进制君 2596

减小伺服电机共振的方法(以松下伺服为例)

嘿 ! 我是【小黄】 , 我们又见面啦 !!! 毕竟技术只有大家交流才会进步嘛 ! 这博客是对自己学习的一点点记录和总结 ,如果您对自动控制感兴趣的话 ,可以关注一下我的动态 , 我们一起学习呀 ! 我们都还年轻 ,我们还有无限可能 。 YES ! 减小伺服电机共振的方法(以松下伺服为例)1. 准备工作:1.1.1 如何推定共振点:1.1.2 测定实操:1.1.3 总结:2. 下期预告: 在我们调试完伺服参数以后机器人运动到某个特定位置会产生振动或异响,我们要做的就是消除这个异响保..

在下小黄的博客 1万+

STL常见问题

1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等 2.标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成

u011244446的专栏 580

亿图图示(edrawmax中文版) v10.1.7pjb

edrawmax中文名叫做亿图图示,是一款非常棒的综合图形图表设计软件,既能实现流程图、架构图、工程图、思维导图等数百种专业领域图形图表的绘制,又能提供一个白板进行头脑风暴和任意编排,轻松实现数据和创意的可视化呈现。软件支持Windows、Mac、Linux及网络版,一端创作,多端同步,从而为跨端办公绘图提供新的解决方案,还兼容常用文档类的办公软件格式,包括图片、Office、PDF、Visio、Html、SVG等,尽可能的在文件格式这块满足用户多方面需求。软件支持创建260多种图表类型,拥有超过12500

qq_43293214的博客 1万+

C++ STL 容器扩容机制详解

当元素数量超过当前容量时,vector会分配一块更大的内存(通常是原容量的1.5或2倍),并将原有数据拷贝到新内存中。理解这些容器的扩容原理,不仅能帮助开发者优化程序性能,还能避免因频繁扩容导致的开销问题。本文将深入剖析STL容器的扩容机制,从内存分配策略到性能优化,为读者揭示其底层实现逻辑。map和set等关联容器基于红黑树实现,其扩容不仅涉及内存分配,还需维持树的平衡性。但由于节点分散存储,其缓存局部性较差。例如,某些实现会预分配一批节点,插入时直接从池中获取,显著提升了高频插入场景的效率。

ntfaxd_053的博客 279

攻防世界 Crypto 新手练习区 1-12 全详解

本篇是攻防世界 Crypto 新手练习区的全解

闵行小鱼塘 3735

px3 有感分析

px3 后续分析

qq_39707917的博客 3116

C++ STL 容器内存优化策略

根据场景选择最匹配的容器能显著减少内存浪费。例如,若已知需要存储1万个元素,提前调用vec.reserve(10000)能将时间复杂度从O(n2)降至O(n)。对于临时对象或右值,使用emplace_back替代push_back可直接在容器内构造对象,避免拷贝开销。swap()函数也能高效交换两个容器内容,其时间复杂度为O(1),适合需要清空容器的场景。通过自定义分配器(如内存池),可将同类型对象集中存储,提升缓存命中率。shrink_to_fit()可请求容器减少容量匹配当前大小,适用于内存敏感场景。

omvtdc_758的博客 227

【unity知识】最新的虚拟相机Cinemachine3简单使用介绍

本文介绍了Unity中Cinemachine 3虚拟相机系统的使用方法。相比旧版本,新版功能更强大且参数分类更直观。文章详细讲解了摄像机镜头参数、旋转控制(包括None、目标跟随、样条线推拉、旋转追随等6种模式)和位置控制(跟随、样条轨道、硬锁定等5种模式)。重点演示了样条轨道摄像机的创建与配置,以及如何实现第一人称和第三人称视角。通过丰富的GIF图示,展示了各种模式的运行效果,帮助用户快速掌握Cinemachine 3的核心功能。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 866

c++ list, vector, map, set 区别与用法比较

List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。 Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,只需要

keep moving 5万+

扫地机器人行业 企业篇-产业总部地理分布

中国扫地机器人产业呈现区域集聚特征,广东省以13家企业领跑全国,其中深圳独占9家(如大疆、云鲸智能等),佛山、广州、东莞各有分布。江苏省6家企业主要集中在苏州(科沃斯、追觅科技等)。北京聚集了石头科技、小米等4家品牌。浙江、山东、湖南等地也有代表性企业分布。国际品牌方面,美国iRobot、韩国三星/LG、日本松下等均在各自国家设立总部,而戴森、飞利浦等欧洲品牌则将中国运营中心设在上海或苏州。值得注意的是,部分品牌如由利、宝家丽虽为外资起源,但主要运营实体已落户中国。

智能硬件研发,欢迎交流 363

pycharm报错cannot start the IED:Error occurred during initialization of VMagent library failed...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1925

C++ STL之容器介绍(vector、list、set、map)

STL(Standard Template Library)即标准模板库。STL通过使用模板实现了容器和算法的分离,允许程序员编写与类型无关的代码,这正是泛型编程的核心思想。

new9232的博客 1602

MoCap 动作捕捉开源库教程

数据通过 tf2 和支持不同 QoS 设置的 /poses 主题直接发布。该软件包最初是为 Crazyswarm 开发的,用于跟踪多达 50 个飞行机器人。

机器人控制与仿真应用 1308

C++中 vector、list、deque、set、map的底层实现

stl容器区别: vector list deque set map-底层实现 stl容器区别: vector list deque set map (转) 在STL中基本容器有: vector、list、deque、set、map set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问 set:集合, 用来判断某一个元素是不是在一个组里面,使

1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

STL介绍以及其底层实现?包括vector, map, list

文章目录1 介绍一下STL?2 STL如何实现vector、list、map的底层机制?1)vector为什么vector的插入操作可能导致迭代器失效?2)list3)map3 vector和list的区别vector插入删除和list有什么区别? 1 介绍一下STL? STL,Standard Template Library,即标准模板库。包括如下六个组件: 它们之间的关系是:分配器给容器分配...

yiliacheng 4262

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++ LIST VECTOR MAP的底层实现

本文参考了网上文章,一搜一大把。 LIST 支持快速增删,底层使用循环双向链表实现。 VECTOR 支持快速随机访问,底层使用数组实现。 当新增数据,超过已申请的剩余空间时,将会自动resize重新申请全部空间,将已有数据和新增数据拷贝给新申请的空间,然后释放原先申请的空间。 MAP KEY值唯一,底层使用红黑树实现,也就是平衡二叉数。 ...

m0_38036892的博客 497

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c++ 中 vector、list 、set 、map等相关容器的区别

1. vector vector 封装了数组 ,是有序的。在内存中是一块连续的内存空间进行存储。但是不支持用户指定空间大小。系统首先分配一个非常大的内存空间进行预备存储,当超过此分配的空间时在进行整体重新分配一块内存空间存储。这就让人感觉可以不指定vector即一个连续内存大小的感觉。通常默认非配的控件能够完成大部分存储的。 优点: 1. 随机访问元素快,支持[]下标与at()访问。 2. 节省...

漫步繁华街的专栏 1万+

c++ vector,list,deque,map,set,hash_map 特点及区别

List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。 Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,只需要改变...

积累点滴,保持自我 895

STL之常用容器string、vector、deque、stack、list、set、map讲解

​ 简述: 了解STL之常用容器string、vector、deque、stack、list、set、map讲解书写一个简单地例子。 文章目录本博文的简述or解决问题?容器:大纲如图:知识点讲解:string:vector:内存结构样子:收缩内存技巧:原理图示:![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbn...

1492

C++ list, vector, map, set 区别与用法比较

一.list和vector List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。 Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多...

chenchen_fcj程序猿的博客 2519
上一篇: MFC中手工创建控件
下一篇: PHP 碰上 Python
newrain021011
博客等级 码龄22年 17粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值