Accelerated c++ 读书笔记1

相关的c++课程听了不少,但听课不能代替看书,书籍系统的总结对于形成体系,查漏补缺还是有很大作用的。

市面上c++书籍多如牛毛,公认好评的无非《c++ primer》,《The c++ programming language》等全面介绍语言特性的书籍和 《effective c++》 《more effective c++》等专家建议类书籍。为了对应自己正在进行的c++系列课程的学习,需要短时间内对c++有一个系统的梳理,即采用2-8原则,以较短的时间,掌握最为常用的那部分。显然上述最上所述两个大部头,不是当下的首选。所以另一本市面已不多见,但也曾公认好评的入门书,《accelerated c++》可能就是最好的选择(像书中所说,如果你想使用c++编程,就需要掌握这本书中的所有知识,尽管它没有告诉你想知道的一切)。在接下来假期这段时间内,自己需要仔细阅读并尽量多地完成书中的习题,在此开始总结帖,希望能把收获进行梳理沉淀。

然而,正如侯捷老师所说,“作为一个好的学习者,重要的事你的学习态度,起步固然可以从轻松小品开始,但如果碰上大部头就退避三舍,逃之夭夭,面对任何技术只求快餐速成,学语言而从来不写程序,那就永远没有成为高手的一天。” 与自己共勉,开学后开读《c++ primer》...

第0章 入门

对hello world程序的讲解梳理,自然不会有什么新的东西,相关概念的复习吧。

第一章 使用字符串

本章程序:

// ask for a person‘s name, and generate a framed greeting
#include <iostream>
#include <string>

int main()
{
    std::cout << "Please enter your first name: ";
    std::string name;
    std::cin >> name;

    // build the message that we intend to write
    const std::string greeting = "Hello, " + name + "!";

    // build the second and fourth lines of the output
    const std::string spaces(greeting.size(), ‘ ‘);
    const std::string second = "* " + spaces + " *";

    // build the first and fifth lines of the output
    const std::string first(second.size(), ‘*‘);

    // write it all
    std::cout << std::endl;
    std::cout << first << std::endl;
    std::cout << second << std::endl;
    std::cout << "* " << greeting << " *" << std::endl;
    std::cout << second << std::endl;
    std::cout << first << std::endl;

    return 0;
}

1. wchar_t 用来存放“宽字符”的内置类型,宽字符是一种足够大的类型,可以为多种语言保存字符。

2. string 类 有一种

string z(n,c)的操作,即定义string类型变量z,并且用字符c的n份复制来初始化z。   注意: c必须为char类型,不能使string类型或字符串常量

3. string类加号  s+t  中, s或者t中任意一个都可以是(但不可以两个都是)字符串直接量或者char类型

所以

std::string exclaim = "!";

std::string s = "Hello" + ", World" + exclaim;  //错误,+左结合,出现了两个字符串常量相加

第二章 循环和计数

本章介绍了while,if,for等语句的用法,设计while语句时的循环不变式的概念,以及算数,逻辑操作符和他们的优先级,新东西不多,看程序和注释吧

#include <iostream>
#include <string>

// say what standard-library names we use
using std::cin;         using std::endl;
using std::cout;        using std::string;

int main()
{
    // ask for the person‘s name
    cout << "Please enter your first name: ";

    // read the name
    string name;
    cin >> name;

    // build the message that we intend to write
    const string greeting = "Hello, " + name + "!";

    // the number of blanks surrounding the greeting
    const int pad = 0;

    // the number of rows and columns to write
    const int rows = pad * 2 + 3;
    const string::size_type cols = greeting.size() + pad * 2 + 2;    //当定义一个变量来保存特定数据结构的大小时,
                                                                     //养成使用标准库定义的相应类型的好习惯 .
                                                                     //size_t  无符号整数类型(来自头文件<cstddef>),可包含任意对象长度
                                                                     //string::size_type 无符号整数类型,包含任意string对象长度 

    // write a blank line to separate the output from the input
    cout << endl;

    // write `rows‘ rows of output
    // invariant: we have written `r‘ rows so far
    for (int r = 0; r != rows; ++r) {

        string::size_type c = 0;

        // invariant: we have written `c‘ characters so far in the current row
        while (c != cols) {

            // is it time to write the greeting?
            if (r == pad + 1 && c == pad + 1) {
                cout << greeting;
                c += greeting.size();
            } else {

                // are we on the border?
                if (r == 0 || r == rows - 1 ||
                    c == 0 || c == cols - 1)
                    cout << "*";
                else
                    cout << " ";
                ++c;
            }
        }

        cout << endl;
    }

    return 0;
}

第三章 使用批量数据

主要是vector的定义和相关操作,以及流输出控制符的介绍。

1 头文件<ios>定义了streamsize 类型,这是输入输出库用来表示长度的类型;

头文件<iomanip>定义了控制符setprecision,用来说明希望输出中包含多少位有效数字

2 vector

size_type 无符号类型,足够存储最大的vector大小;

v.begin(),  v.end(), v.push_back, v.size(),

3 其他库函数

sort(b,e),  max(e1,e2), while(cin>>x),

s.precision(n) 设置流s以后的输出精度为n,(省略n保持原有的输出精度)返回原有的输出精度

setprecision(n)

#include <algorithm>
#include <iomanip>
#ifndef __GNUC__
#include <ios>
#endif
#include <iostream>
#include <string>
#include <vector>

using std::cin;             using std::sort;
using std::cout;            using std::streamsize;
using std::endl;            using std::string;
using std::setprecision;    using std::vector;

int main()
{
    // ask for and read the student‘s name
    cout << "Please enter your first name: ";
    string name;
    cin >> name;
    cout << "Hello, " << name << "!" << endl;

    // ask for and read the midterm and final grades
    cout << "Please enter your midterm and final exam grades: ";
    double midterm, final;
    cin >> midterm >> final;

    // ask for and read the homework grades
    cout << "Enter all your homework grades, "
            "followed by end-of-file: ";

    vector<double> homework;
    double x;
    // invariant: `homework‘ contains all the homework grades read so far
    while (cin >> x)
        homework.push_back(x);

    // check that the student entered some homework grades
#ifdef _MSC_VER
    typedef std::vector<double>::size_type vec_sz;
#else
    typedef vector<double>::size_type vec_sz;
#endif
    vec_sz size = homework.size();
    if (size == 0) {
        cout << endl << "You must enter your grades.  "
                        "Please try again." << endl;
        return 1;
    }

    // sort the grades
    sort(homework.begin(), homework.end());

    // compute the median homework grade
    vec_sz mid = size/2;
    double median;
    median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2
                           : homework[mid];

    // compute and write the final grade
    streamsize prec = cout.precision();
    cout << "Your final grade is " << setprecision(3)
         << 0.2 * midterm + 0.4 * final + 0.4 * median
         << setprecision(prec) << endl;

    return 0;
}
时间: 2024-10-09 12:52:34

Accelerated c++ 读书笔记1的相关文章

读书笔记-2015年第1本:《暗时间》

作者所说的暗时间,其实在生活中,我自己也有领悟到,领悟的时候很感慨,然而过不了几天就把这个领悟给忘得一干二净,于是又是过着重蹈覆辙的生活.现在给我的提醒就是把领悟到的东西记录下来,每天空出一些时间静下心专门来思考这些领悟到的东西.现在有幸看到自己曾经遗忘的宝贵的生活哲理,好好思考,好好领悟. 在这本书中,作者推荐了大量有价值的学习资料以及学习方法,有时间时都可以去研究学习. 我们可以看出,作者很有学问,但也可以想一下为何如此有学问?“看上去好像很高端的样子”,实际上,也就是作者曾经在一年内看过很

《深入理解Android2》读书笔记(四)

接上篇<深入理解Android2>读书笔记(三) ActivityManagerService(AMS) 1.AMS由ActivityManagerNative(AMN)类派生,并实现Watchdog.Monitor和BatteryStatsImpl.BatteryCallback接口.而AMN由Binder派生,实现了IActivityManager接口. 2.客户端使用ActivityManager类.由于AMS是系统核心服务,很多API不能开放供客户端使用,因此设计者没有让Activit

《C#图解教程》读书笔记之三:方法

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.方法那些事儿 (1)方法的结构:方法头-指定方法的特征,方法体-可执行代码的语句序列: (2)方法的调用:参数.值参数.引用参数.输出参数.参数数组: ①参数: 形参-本地变量,声明在参数列表中:形参的值在代码开始之前被初始化: 实参-实参的值用于初始化形参: ②值参数: 为形参在栈上分配内存,将实参的值复制到形参: ③引用参数: 不为形参在栈上分配内存,形参的参数名作为实参变量的别名指向同一位置,必须使用ref关

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

《Effective C++》读书笔记汇总

我之前边读<Effective C++>边写下每个条款的读书笔记,这一版是C++11之前的版本.这里我将每个条款令我印象深刻的点小结一下. 1.C++包括:Plain C(面向过程).OOP(面向对象).模板(泛型和模板元编程).STL(C++标准库). 2.用inline.enum.const代替#define.#define定义的宏,一旦复杂起来,高手都很难掌控.不要带入C的习惯. 3.灵活使用const前缀.不需要进行改变的数据加上const前缀.指针的const前缀有两种形式,cons

【读书笔记】《Linux内核设计与实现》内核同步介绍&内核同步方法

简要做个笔记,以备忘. 需同步的原因是,我们并发访问了共享资源.我们将访问或操作共享资源的代码段称"临界区",如果两个执行线程处于同一临界区中同时执行,称"竞争条件".这里术语执行线程指任何正在执行的代码实例,如一个在内核执行的进程.一个中断处理程序或一个内核线程. 举个简单例子,i++操作.该操作可以转换为下面的机器指令序列: 1.得到当前变量i的值,并保存到一个寄存器. 2.将寄存器的值加1. 3.将i的新值写回到内存中. 当两个线程同时进入这个临界区,若i初值

鸟哥的Linux私房菜 基础学习篇读书笔记(7):Linux文件与目录管理

这一章主要讲述的是如何操作与管理Linux系统中的文件和目录,主要包括目录间的切换,目录的创建与删除,文件的创建与删除,文件的查找,文件内容的查看等等. 前一章中已经讲过相对路径以及绝对路径,绝对路径就是指从根目录("/")开始写起的路径名,而相对路径绝不会由根目录开始写起,相反,相对路径是相对于当前工作目录的路径名.Linux操作系统中有几个特殊的目录: . 代表此层目录: .. 代表上一层目录: - 代表前一个工作目录: ~ 代表当前用户身份所在的主文件夹: ~account 代表

《30天自制操作系统》读书笔记(2)hello, world

让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实上你用的是U盘还是软盘对我们的操作系统没有影响,缺点是你的U盘刷入系统后容量只能是1440 MB,即当年流行的3.5英寸软盘的大小,当然不用担心,再格式化一次(用DiskGeniu),就可以恢复. 我做事情的话,总是怕自己的努力的结果白费了,害怕辛辛苦苦看完这本书但是发现做出来的东西现在根本没法用,

《巴菲特与索罗斯的投资习惯》读书笔记

巴菲特与索罗斯的投资习惯 收益与风险 收益越高风险越大,或者风险越大收益越高都是没有道理的,风险和收益逻辑上不一定是正相关的,只不过收益越高,人们愿意承担的风险越高而已. 降低风险的同时提高收益是不矛盾的.但风险控制应优先于收益. 同样的事情,对你来说是危险的,但对于高手来说则没有风险,因此,为了降低风险,尽力成为高手吧 关于投资 赚钱只是投资的目的而已,投资策略才是投资的手段. 只是将注意力集中在目的上是没有意义的,因为它只是你的手段所产生的自然结果. 因此我们需要把注意力几种在对投资策略的调