《Accelerate C++》读书笔记(二)

本文详细介绍了C++中关联容器的高效查找特性,以及数对(pair)作为简单数据结构的应用。重点阐述了如何利用映射表进行元素查找,并通过实例解释了数对(pair)在映射表中的作用。此外,还讨论了C++函数参数的缺省值使用规则,以及随机数生成方法的改进策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

13、关联容器提供了高效的方法来让我们查找一个包含特定值而且有可能同时包含了附加信息的元素。

14、一个数对(pair)是一个简单的数据结构,它保存了两个分别叫做first和second的元素。映射表中每一个元素都是一个数对,若间接引用一个映射表的迭代器,获得的即为何这个映射表关联的一个pair类型值。pair(const key, value),一般键值为常量,不允许随意改变。

15、关联容器中若有元素也为某个容器元素,需要注意编译器对符号>>的规则,如:map<string,vector<int>> 最后两个>之间必须有空格才能被编译通过。

16、关于C++缺省参数的使用:a: 如果函数已经带有缺省参数的函数原型声明,则在函数的定义中不允许出现缺省值。b:一旦为函数的某个参数指定了缺省值,则必须为后续参数也定义缺省值,从右到左定义缺省参数。c:调用函数时,如果略去一个参数的传递,则略去后续所有参数传递,调用时将参数从左至右,逐一传递给行参。

17、随机数产生函数: 系统自带的rand()函数返回[0,RAND_MAX),其中RAND_MAX是系统定义的一个大数。若要求一个范围内的随机数,则可能用rand()%n求得产生[0,n)间的随机数,但是该方法存在两点不足: 1、若n非常小时,所产生的余数可能不是伪随机数;2、若n比较大,那RAND_MAX不会均匀的被n除尽,一些余数出现的频率将会比其他的更大,若RAND_MAX为32767,n=20000,则10000和30000均使rand()%n值为10000,但是15000则只有一个值。

int bucket_size=RAND_MAX/n
do{
 int r=rand()/bucket_size
}while(r>=n);

18、C++中关联容器存在键值对,其中键key作为索引,可以使整数,也可以使字符串,要求能够进行比较。与顺序容器相比,关联容器是自动排序的。

19、若使用一个未曾出现过的键作为映射表的索引,那个这个映射表会自动创建一个具有这个键的新元素,且这个元素具有初始化的值。


本书全面介绍了C++语言。作为一本入门书(Primer),它以教程的形式对C++语言进行清晰的讲解,并辅以丰富的示例和各种学习辅助手段。与大多数入门教程不同,本书对C++语言本身进行了详尽的描述,并特别着重介绍了目前通行的、行之有效的程序设计技巧。   无数程序员曾使用本书的前几个版本学习C++,在此期间C++也逐渐发展成熟。这些年来,C++语言的发展方向以及C++程序员的关注点,已经从以往注重运行时的效率,转到千方百计地提高程序员的编程效率上。随着标准库的广泛可用,我们现在能够比以往任何时候更高效地学习和使用C++。本书这一版本充分体现了这一点。第4版的改动为了体现现代C++编程风格,我们重新组织并重写了本书。书中不再强调低层编程技术,而把中心转向标准库的使用。书中很早就开始介绍标准库,示例也已经重新改写,充分利用了标准库设施。我们也对语言主题叙述的先后次序进行了重新编排,使讲解更加流畅。除重新组织内容外,为了便于读者理解,我们还增加了几个新的环节。每一章都新增了“小结”和“术语”,概括本章要点。读者可以利用这些部分进行自我检查;如果发现还有不理解的概念,可以重新学习该章中的相关部分。书中还加入了下述几种学习辅助手段:重要术语用黑体表示,我们认为读者已经熟悉的重要术语则用楷体表示。这些术语都会出现在章后的“术语”部分。书中用特殊版式突出标注的文字,是为了向读者提醒语言的重要特征,警示常见的错误,标明良好的编程实践,列出通用的使用技巧。希望这些标注可以帮助读者更快地消化重要概念,避免犯常见错误。为了更易于理解各种特征或概念间的关系,书中大量使用了前后交叉引用。.. 对于某些重要概念和C++新手最头疼的问题,我们进行了额外的讨论和解释。这部分也以特殊版式标出。学习任何程序设计语言都需要编写程序。因此,本书提供了大量的示例。所有示例的源代码可从下列网址获得: http://www.awprofessional.com/cpp_primer 万变不离其宗,本书保持了前几版的特色,仍然是一部全面介绍C++的教程。我们的目标是提供一本清晰、全面、准确的指南性读物。我们通过讲解一系列示例来教授C++语言,示例除了解释语言特征外,还展示了如何善用这门语言。虽然读者不需要事先学过C语言(C++最初的基础)的知识,但我们假定读者已经掌握了一种现代结构化语言。本书结构本书介绍了C++国际标准,既涵盖语言的特征,又讲述了也是标准组成部分的丰富标准库。C++的强大很大程度上来自它支持抽象程序设计。要学会用C++高效地编程,只是掌握句法和语义是远远不够的。我们的重点,在于教会读者怎样利用C++的特性,快速地写出安全的而且性能可与C语言低层程序相媲美的程序。 C++是一种大型的编程语言,这可能会吓倒一些新手。现代C++可以看成由以下三部分组成: l 低级语言,多半继承自C。 l 更高级的语言特征,用户可以借此定义自己的数据类型,组织大规模的程序和系统。 l 标准库,使用上述高级特征提供一整套有用的数据结构和算法。多数C++教材按照下面的顺序展开:先讲低级细节,再介绍更高级的语言特征;在讲完整个语言后才开始解释标准库。结果往往使读者纠缠于低级的程序设计问题和复杂类型定义的编写等细节,而不能真正领会抽象编程的力量。就更不用说学到足够的知识去创建自己的抽象了。本版中我们独辟蹊径。一开始就讲述语言的基础知识和标准库,这样读者就可以写出比较大的有实际意义的程序来。透彻阐释了使用标准库(并且用标准库编写了各种抽象程序)的基础知识之后,我们才进入下一步,学习用C++的其他高级特征,来编写自己的抽象。第一和第部分讨论语言的基础知识和标准库设施。其重点在于学会如何编写C++程序,如何使用标准库提供的抽象设施。大部分C++程序员需要了解本书这两部分的内容。除了讲解基础知识以外,这两部分还有另外一个重要的意图。标准库设施本身是用C++编写的抽象数据类型,定义标准库所使用的是任何C++程序员都能使用的构造类的语言特征。我们教授C++的经验说明,一开始就使用设计良好的抽象类型,读者会更容易理解如何建立自己的类型。第三到第五部分着重讨论如何编写自己的类型。第三部分介绍C++的核心,即对类的支持。类机制提供了编写自定义抽象的基础。类也是第四部分中所讨论的面向对象编程和泛型编程的基础。全书正文的最后是第五部分,我们在这一部分讨论了一些高级特征,它们在构建大型复杂系统时最为常用。致谢与前几版一样,我们要感谢Bjarne Stroustrup,他不知疲倦地从事着C++方面的工作,他与我们的深厚友情由来已久。我们还要感谢Alex Stepanov,正是他最初凭借敏锐的洞察力创造了容器和算法的概念,这些概念最终形成了标准库的核心。此外,我们要感谢C++标准委员会的所有成员,他们多年来为C++
### 提升C++性能或加速C++程序的方法 为了提高C++程序的性能,可以采用多种策略和技术。以下是几个重要的方法: #### 避免过早优化 通常建议遵循高德纳(Donald Knuth)的观点:“过早优化是一切罪恶之源。”这意味着不应在开发初期就专注于优化代码,而应优先关注功能实现和可维护性[^1]。 #### 减少不必要的对象创建 频繁的对象创建和销毁会增加内存分配开销并降低性能。通过重用现有对象或者减少临时对象的数量来改善这一情况是一个有效的手段。 #### 使用右值引用与移动语义 自C++11起引入了右值引用的概念,这使得我们能够定义移动构造函数和移动赋值运算符,从而避免深拷贝操作带来的额外成本。利用这些特性可以在处理大型数据结构时显著提升效率。 ```cpp class MyClass { public: std::vector<int> data; // Move constructor MyClass(MyClass&& other) noexcept : data(std::move(other.data)) {} // Move assignment operator MyClass& operator=(MyClass&& other) noexcept { if (this != &other) { data = std::move(other.data); } return *this; } }; ``` #### 利用SIMD指令集如NEON 对于涉及大量数值计算的应用场景来说,使用单指令多数据流(SIMD)技术能极大地加快执行速度。ARM平台上的NEON扩展就是一个例子;它允许同时对多个数据项应用相同的操作。当面对大规模的数据集合时,合理调整算法以适应平铺(tile-based)方式有助于提高缓存命中率进而增强表现力[^2]。 #### 编译器自动向量化 现代编译工具具备一定程度上自动化矢量化的功能,在简单循环条件下可以帮助开发者获得一定的性能增益。然而需要注意的是,针对复杂逻辑环路而言,这种内置机制可能效果有限甚至完全失效。因此如果追求极致的速度,则往往还需要依赖手动调优措施来进行深入改进。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值