当前位置:首页 > > 充电吧
[导读]第1章 容器第1条:慎重选择容器类型。标准STL序列容器:vector、string、deque和list。标准STL关联容器:set、multiset、map和multimap。非标准序列容器sli

第1章 容器


第1条:慎重选择容器类型。


标准STL序列容器:vector、string、deque和list。


标准STL关联容器:set、multiset、map和multimap。


非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一“重型”string。


非标准的关联容器hash_set、hase_multiset、hash_map和hash_multimap。


vector


vector作为标准关联容器的替代。(见第23条)


几种标准的非STL容器,包括数组、bitset、valarray、stack、queue和priority_queue。


你是否关心容器中的元素是如何排序的?如果不关心,选择哈希容器.


容器中数据的布局是否需要和C兼容?如果需要兼容,就只能选择vector。(见第16条)


元素的查找速度是否是关键的考虑因素?如果是,就要考虑哈希容器、排序的vector和标准关联容器-或许这就是优先顺序。


对插入和删除操作,你需要事务语义吗?如果是,只能选择list。因为在标准容器中,只有list对多个元素的插入操作提供了事务语义。


deque是唯一的、迭代器可能会变为无效(插入操作仅在容器末尾发生时,deque的迭代器可能会变为无效)而指向数据的指针和引用依然有效的标准STL容器。


第2条:不要试图编写独立于容器类型的代码。


如果你想编写对大多数的容器都适用的代码,你只能使用它们的功能的交集。不同的容器是不同的,它们有非常明显的优缺点。它们并不是被设计用来交换使用的。


  你无法编写独立于容器的代码,但是,它们(指客户代码)可能可以。


第3条:确保容器中的对象拷贝正确而高效。


copy in,copy out,是STL的工作方式,它总的设计思想是为了避免不必要的拷贝。使拷贝动作高效并且防止剥离问题发生的一个简单办法是使容器包含指针而不是对象。


第4条:调用empty而不是检查size()是否为0。


  理由很简单:empty对所有的标准容器都是常数时间操作,而对一些list的实现,size耗费线性时间。


第5条:区间成员函数优先于与之对应的单元素成员函数。


区间成员函数写起来更容易,更能清楚地表达你的意图,而且它们表现出了更高的效率。


第6条:当心C++编译器最烦人的分析机制。


把形参加括号是合法的,把整个形参的声明(包括数据类型和形参名字)用括号括起来是非法的。


第7条:如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉。


STL很智能,但没有智能到知道是否该删除自己所包含的指针所指向的对象的程度。为了避免资源泄漏,你必须在容器被析构前手工删除其中的每个指针,或使用引用计数形式的智能指针(比如Boost的sharedprt)代替指针。


第8条:切勿创建包含auto_ptr的容器对象。


拷贝一个auto_ptr意味着改变它的值。例如对一个包含auto_ptr的vector调用sort排序,结果是vector的几个元素被置为NULL而相应的元素被删除了。


第9条:慎重选择删除元素的方法。


要删除容器中指定值的所有对象:


如果容器是vector、string或deque,则使用erase-remove习惯用法。


SeqContainer


c.erase(remove(c.begin(),c.end(),1963),c.end());


如果容器是list,则使用list::remove。


如果容器是一个标准关联容器,则使用它的erase成员函数。


要删除容器中满足特定条件的所有对象:


如果容器是vector、string或deque,则使用erase-remove_if习惯用法。


如果容器是list,则使用list::remove_if。


如果容器是一个标准关联容器,则使用remove_copy_if和swap,或者写一个循环遍历容器的元素,记住当把迭代器传给erase时,要对它进行后缀递增。


AssocCOntainer


...


AssocContainer


remove_copy_if(c.begin(), c.end(), inserter(goodValues, goodValues.end()),badValue);


c.swap(goodValues);



for(AssocContainer


if(badValue(*i)) c.erase(i++);


else ++i;


}


要在循环内部做某些(除了删除对象之外的)操作:


如果容器是一个标准序列容器,则写一个循环来遍历容器中的元素,记住每次掉用erase时,要用它的返回值更新迭代器。


如果容器是一个标准关联容器,则写一个循环来遍历容器中的元素,记住每次把迭代器传给erase时,要对迭代器做后缀递增。


第10条:了解分配子(allocator)的约定和限制。


第11条:理解自定义分配子的合理用法。


第12条:切勿对STL容器的线程安全性有不切实际的依赖。


对一个STL实现你最多只能期望:


多个线程读是安全的。


多个线程对不同的容器写入操作是安全的。


你不能期望STL库会把你从手工同步控制中解脱出来,而且你不能依赖于任何线程支持。


第2章vector和string


第13条:vector和string优先于动态分配的数组。


如果用new,意味着你要确保后面进行了delete。


如果你所使用的string是以引用计数来实现的,而你又运行在多线程环境中,并认为string的引用计数实现会影响效率,那么你至少有三种可行的选择,而且,没有一种选择是舍弃STL。首先,检查你的库实现,看看是否可以禁用引用计数,通常是通过改变某个预处理变量的值。其次,寻找或开发一个不使用引用计数的string实现。第三,考虑使用vector


第14条:使用reserve来避免不必要的重新分配。


通常有两种方式来使用reserve以避免不必要的重新分配。第一种方式是,若能确切知道或大致预计容器中最终会有多少个元素,则此时可使用reserve。第二种方式是,先预留足够大的空间,然后,当把所有的数据都加入后,再去除多余的容量。


第15条:注意string实现的多样性。


如果你想有效的使用STL,那么你需要知道string实现的多样性,尤其是当你编写的代码必须要在不同的STL平台上运行而你又面临着严格的性能要求的时候。


第16条:了解如何把vector和string数据传给旧的API。


如果你有个vector v,而你需要得到一个只想v中的数据的指针,从而可把数据作为数组来对才,那么只需要使用&v[0]就可以了,也可以用&*v.begin(),但是不好理解。对于string s,随应的形式是s.c_str()。


如果想用来自C API的数据来初始化一个vector,那么你可以利用vector和数组的内存布局兼容性,先把数据写入到vector中,然后把数据拷贝到期望最终写入的STL容器中。


第17条:使用“swap技巧”出去多余的容量。


vector


表达式vector


同样的技巧对string也实用:


string s;


...


string(s).swap(s);


第18条:避免使用vector


作为STL容器,vector


第3章 关联容器


第19条:理解相等(equality)和等价(equivalence)的区别。


标准关联容器总是保持排列顺序的,所以每个容器必须有一个比较函数(默认为less)。等价的定义正是通过该比较函数而确定的。相等一定等价,等价不一定相等。




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭