慎重选择容器类型

 

慎重选择容器类型

一、回顾C++提供的容器

Ø        标准的STL序列容器

vector、string、deque和list。

Ø        标准的STL关联容器

set、multiset、map和multimap。

Ø        非标准序列容器

slist和rope。

Ø        非标准的关联容器

hash_set、hash_multiset、hash_map和hash_multimap。

Ø        几种标准的非STL容器

数组、bitset、valarray、stack、queue和priority_queue。

 

二、一些常见的容器选择问题

Ø        你是否需要在容器的任意位置插入新元素?

如果需要,就选择序列容器;关联容器是不行的。

 

Ø        你是否关心容器中的元素是如何排序的?

如果不关心,则哈希容器是一个可行的选择方案;否则,你要避免哈希容器。

 

Ø        你选择的容器必须是标准C++的一部分吗?

如果必须是,就排除了哈希容器、slist和rope。

 

Ø        你需要哪种类型的迭代器?

如果它们必须是随机访问迭代器,则对容器的选择就被限定为vector、deque和string。或许你也可以考虑rope。如果要求使用双向迭代器,那么你必须避免slist以及哈希容器的一个常见实现。

 

Ø        当发生元素的插入或删除操作时,避免移动容器中原来的元素是否很重要?

如果是,就要避免连续内存的容器。

 

Ø        容器中的数据的布局是否需要和C兼容?

如果需要兼容,就只能选择vector容器。

 

Ø        元素的查找速度是否关键的考虑因素?

如果是,就要考虑哈希容器,排序的vector,和标准关联容器 --- 或许这就是优先顺序。

 

Ø        如果容器内部使用了引用计数技术(reference counting),你是否介意?

如果是,就要避免使用string,因为许多string的实现都是用了引用计数。Rope也需要避免,因为权威的rope实现是基于引用计数的。当然,你需要某种表示字符串的方法,可以考虑vector<char>。

 

Ø        对插入和删除操作,你需要事务语义(transactional semantics)吗?也就是说在插入和删除操作失败时,你需要回滚的能力吗?

如果需要,你就要使用基于节点的容器。如果对多个元素的插入操作需要事务语义,则你需要选择list,因为在标准容器中,只有list对多个元素的插入操作提供了事务语义。

 

Ø        你需要使迭代器、指针和引用变为无效的次数最少吗?

如果是这样,就要使用基于节点的容器,因为对这类容器的插入和删除操作从来不会使迭代器、指针和引用变为无效(除非它们指向了一个你正在删除的元素)。而针对连续内存容器的插入和删除操作一般会使指向该容器的迭代器、指针和引用变为无效。

 

Ø        如果序列容器的迭代器是随机访问迭代器类型,而且只要没有删除操作发生,且插入操作只发生在容器的末尾,则指向数据的指针和引用就不会变为无效,这样的容器是否对你有帮助?

这是非常特殊的情况,但如果你面对的情形正是如此,则deque是你所希望的容器。(有意思的是,当插入操作仅在容器末尾发生时,deque的迭代器有可能变为无效。deque是唯一的迭代器可能会变为无效而指针和引用不会变为无效的STL标准容器。)

时间: 2024-10-13 19:05:18

慎重选择容器类型的相关文章

Excel2007基础教程:选择特殊类型的单元格

Excel2007基础教程:选择特殊类型的单元格 在使用Excel 的时候,或许需要在工作表中定位特殊类型的单元格.例如,是否便于定位每个含有公式的单元格,或者所有其值都依赖于当前单元格的单元格? Excel 提供了简便的方法定位这些单元格和其他特殊类型的单元格.只需选择"开始"吟"查找和选择" -> "定位条件"就可显示"定位条件"对话框, 在对话框中选择以后, Excel 会选择当前选项中符合条件的单元格子集.单元格

求这该怎么选择容器,c++

问题描述 求这该怎么选择容器,c++ 现在这个项目,每0.1秒服务器接受一次数据,然后保存到容器里,同时还需要用另一个数据与此容器进行遍历匹配,而且项目要求效率也要高,求助,这样怎么选择容器 解决方案 用set vator map等都可以.你的性能瓶颈不在这里. 解决方案二: C++中如何选择容器C++容器选择C++ 选择容器的提示 解决方案三: 用map容器就可以了 解决方案四: 你用hash table等,查找效率比较高.STL模板库中有.

Mesos将使用统一的容器管理器支持多种容器类型

本文讲的是Mesos将使用统一的容器管理器支持多种容器类型,[编者的话]本文介绍了Mesos即将发布的一个新的功能,即使用统一的容器管理器来支持多种容器类型.包含了实现此功能的原因.能为Mesos用户带来的益处.发布的时间表和用户在使用此功能时应该注意的问题等. Apache Mesos从2014年年底开始支持Docker作为其缺省容器类型的替代品,但是现在这个流行的集群调度平台已经接近完成一个更简单的方式意在替换现在已经存在的两种容器方式,以简化其未来的框架开发工作. 除了这个目的之外,这个"

c++-MFC 创建文本文件 如何选择文本类型

问题描述 MFC 创建文本文件 如何选择文本类型 我想创建ANSI的,而不是unicode的 直接用CFile::Open()貌似默认是unicodde的... 解决方案 二进制方式打开,写入0xFFFE文件头,就是unicode,否则就是ansi的.当然你写入的char也要是ANSI的. 参考:http://blog.csdn.net/chenlycly/article/details/17929617 解决方案二: 用fstream来创建文件

asp.net 选择excel类型文件,利用Dos命令成批复制文件_实用技巧

1.选择excel类型文件 复制代码 代码如下: OpenFileDialog fileDialog = new OpenFileDialog(); // fileDialog.InitialDirectory = "d:\\"; fileDialog.Title = "选择文件"; //fileDialog.Filter = "xml files (*.xml)|*.xml"; fileDialog.Filter = "Excel文件

Java容器类型学习笔记

最近抽空把java.lang下面常用的那些容器类型(数据结构)复习了一下,这些东西是基础,平时使用的时候也可以很容易查得到,有些方法大概知道,但是总是弄混,如果可以记住那些重要方法,并且能够熟练使用的话,还是可以让编码过程变得容易很多.另外一个是实现机制,对于常用数据结构的实现机制,应该说是必须要熟知的. 另外,并发容器我之前整理过,放在这篇文章里. Queue add和offer的区别在于达到上限时add抛出异常,offer返回false: remove和poll的区别在于,队列为空时前者抛出

企业要慎重选择高防服务器租用托管

摘要:作为一个正规IDC商,首先要建立能够符合客户持续发展需求的高品质高防机房,同时能够大规模.集中地获取各种电信资源,拥有丰富的技术资源. 随着互联网的飞速发展,整个IDC产业也达到了发展高峰.与此同时,网络攻击.流量攻击也正在互联网上的大肆泛滥,给诸多企业网站带来不小的危害.其中,DDOS攻击和CC攻击影响最大.如何避免DDOS攻击和CC攻击,成为企业们的燃眉之急,越来越多的企业面对网络攻击问题不知所措和力不从心.这时,大多企业把希望寄托在服务器的选择上,服务器是全面防御流量攻击的第一关,也

SAP WM LQ02 事务代码界面里不能为指定仓库号选择移动类型的问题对策

SAP WM LQ02 事务代码界面里不能为指定仓库号选择移动类型的问题对策 LQ02, 试图为仓库号360下设置一个JOB,能自动为供应商寄售库存自动去K: 经过查询,如下配置漏掉了:     增加了如下的配置项目:   配置完成之后,LQ02就可以了:   2016-11-10 写于武汉市经开区.    

今古:选择网站类型的两大原则与四大方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 做一个网站,第一步就是要确定网站的主题类型.定位很重要,是因为定位决定了后续的内容建设.网站推广的方法途径.需要积累的人脉资源等等. 有不少的站长都有过这样的经历,做过明星绯闻网.采集过论文站.搞过地方论坛.也玩过QQ非主流.这是一段见识.积累的过程.今古也是做了很多站.才确定了现在天禧创业网的主题.如果过了一年,你还是没有找到适合自己的站,