Accelerated C++

最近读了Accelerated C++,做一下整理笔记

第0章 入门

1. 如果要使用头文件中的人和名字,需要提前#include;

2. return 0表示成功;

第三章  使用批量数据

1. 对于类的对象来说,类自己会说明如果没有指定初始化的值会如何初始化,如string会初始化为空字符串;然而其他的没有显式初始化的内置类型的局部变量是不明确的,可能是变量创建时所占内存刚好含有的值;

2. 输出double类型的精度可以使用setprecision来控制输出的小数位数;

3. 比如vector.size()这种类型的变量,因为不同的系统可能会定义出不同的类型,因此使用标准库定义的size_type来表示容器的大小是一个良好的习惯做法,我们也应该使用它来定义容器的大小;

4. 定义了homework这个vector类型的变量之后,可以使用sort(homework.begin(),homework.end())来对其进行排序;

5.不管什么时候,如果一个表达式中同时出现了普通的整数和无符号类型的整数,普通的整数都会被转换成无符号类型。因此表达式homework.size()-100会生成一个无符号类型的结果,也就是说它永远都不会比0小;

第四章 组织程序和数据

1. 传值调用法,向函数的形参传递实参的数值,形参将会是实参的拷贝;

2. 引用调用法,通过向函数传递引用进行传递,这种做法直接使用实参的数值,不拷贝;另一方面,如果不想改变实参的数值,可以使用const &引用,需要注意的是:

如果我们定义了一个非const类型的引用,就不能让它指向一个常量对象或者常量引用,因为这样做会违反const的意思。

因此不能给非常量引用的形参传递常量引用,但是可以给常量形参传递非常量引用;

3. 如果结构体类型的容器,调用sort,是不知道你进行比较的是结构体中的那个元成员的,因此可以单独实现comare类型的谓词,在谓词中对结构体的成员进行比较,返回比较的结果,这样再对容器进行sort时,第三个变量传入这个谓词,即可实现针对某一成员的比较如:

bool compare(const Student_info& x, const Student_info& y){ return x.name<y.name;} //实现由小到大的排序
sort(students.begin(),students.end(),compare)

4. 当我们在#include 指令中使用一对双引号,而不是尖括号,来把头文件名字包括起来,这样做的意思是,要求编译器把这个头文件的全部内容复制到程序中#include所在的地方;

5. 头文件应当只声明那些必要的名字,通过限定头文件中的名字,我们可以为用户提供最大的灵活性。如果在头文件中写了using std::vector的声明,那么包含头文件的所有程序都会有这样的声明,不管它们是否需要,因此头文件应当使用完整的经过限定的名字,而不是使用using声明;

6. 一个好习惯:作为编译程序的一部分,头文件需要确保多次包含一个头文件是安全的,方法就是在.h的声明的开始和结束处加入#ifndef #endif

7. 在源文件中,使用using声明没有什么问题。

8. 函数名可以重载。只要函数的参数个数或类型不同,同一个函数名function-name就可以定义多个函数,系统可以区分相同类型的引用和常量引用。

第五章 使用序列式容器并分析字符串

1. 迭代器是一个值,它能够

  a. 标识一个容器和容器的一个元素

  b. 允许检测元素中保存的值;

  c. 提供在容器元素之间移动的操作;

  d. 使用容器可用有效处理的方式来约束可用的操作;

2. 迭代器,我的理解实际上就是容器中的一个元素的指针。如:vector<Student_info>::const_vector iter = students.begin();

3. 通过对迭代器进行*解引用,如 *iter.name, iter->name可以访问该元素的变量;

4. 可以用过对迭代器进行使用,取代索引;对迭代器的直接++可以指向下一个元素;

5. vector 容器是数组类型的,可以随机索引,缺点是插入和删除很慢,因为需要移动所有的元素;

    当从vector中删除一个元素时,指向被删除元素和它之后所有元素的迭代器就都失效了,而push back会使所有的都失效。因为从vector中删除一个元素会移动后面的所有元素,而push back会引起整体vector的重新分配。因此,使用vector类型的begin end,如果调用了push back之类的,需要格外的小心迭代器的失效问题。

    list容器是链表类型的,不能随机索引,但是可以随机的插入删除。

    由于list不支持随机访问,因此无法使用标准库sort对list进行排序,但是list中有自己的sort成员函数。

第八章 编写反泛型函数

1. 实现泛型函数的语言特性叫做模板函数

template <typename T>
inline T const& Max (T const& a, T const& b) 
{ 
    return a < b ? b:a; 
} 

2. 如果你使用一个依赖于模板参数的类型,如vector<T>,而且你想要使用这个类型的成员时,比如size_type,它本身也是一个类型时,你必须在整个名字之前加上type_name,以便让系统知道要把这个名字当作一个类型来对待。即如:

typedef typename vector<T>::size_type vec_sz;

vec_sz size = v.size();

3. 迭代器:C++标准库中的一个重要贡献是,通过把迭代器用作算法和容器之间的粘合剂,算法可以获得数据结构的独立性,此外,算法使用的迭代器都要求支持某些操作,这样我们就可以根据这些操作来分解算法,这就意味着,我们很容易把一个容器和能够在这个容器上使用的算法匹配起来。

迭代器分为五种: 输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机访问迭代器。

vector和string的迭代器都是随机访问迭代器,因为都可以要求随机访问,list类型是双向的,只能顺序递增递减。





Accelerated C++源代码 本书全面介绍了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++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值