Accelerated C++ 学习笔记

概述

阅读《Accelerated C++》时的笔记,记录下每一章使用的库函数。

第一章 使用字符串

本章介绍了两个标准库 iostreamstringiostream 处理输入输出流,string 包含针对字符串封装的一系列方法。

#include <iostream>
#include <string>

std::string input;
std::cin >> input;
std::cout << "this is user input: " + input << endl;

std::string str = "this is a string";
std::string::size_type size = str.size();
str.substr(start, length);

第二章 循环和计数

本章介绍了 whilefor 循环,与熟悉的其他编程语言并无二致。比较新颖的是定义 string 类型的变量时可以使用如下方式,类似于循环的功能。

#include <string>

std::string str(count, "some charactor such as #"); // str is "#####..."

第三章 使用批量数据

本章介绍了 vector,可以随机位置访问,删除数据会造成后续数据大量移动,性能较差,底层应该是数组实现。

#include <iostream>
#include <vector>

std::vector<double> v;
v.push_back(1.0);
v.push_back(2.0);
v.push_back(3.0);
v.push_back(4.0);

std::cout << v[0] << " " << v[1] << std::endl;

typedef std::vector<double>::size_type vector_size;

for (vector_size i = 0; i != v.size(); i++) {
    std::cout << v[i] << " ";
}
std::cout << std::endl;

for (vector_size i = 0; i != v.size(); i++) {
    if (v[i] == 2.0) {
        v.erase(v.begin() + i);
    }
}

for (vector_size i = 0; i != v.size(); i++) {
    std::cout << v[i] << " ";
}
std::cout << std::endl;

第四章 组织程序和数据

本章介绍了如何将代码分成独立文件并引入使用,同时介绍了命名空间的概念。

// average.h
#ifndef average_h
#define average_h

#include <vector>

double average(const std::vector<double>&);

#endif
// average.cpp
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

double average(const vector<double>& data) {
    double sum = 0;
    vector<double>::size_type size = data.size();

    for (vector<double>::const_iterator i = data.begin(); i != data.end(); i++) {
        sum += *i;
    }

    return sum / size;
}
// main.cpp
#include <iostream>
#include "average.h"

using std::cout;
using std::endl;

int main() {
    std::vector<double> data;
    data.push_back(10.5);
    data.push_back(11.3);
    data.push_back(22.6);

    double result = average(data);

    cout << result << endl;
}

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

本章介绍了 list,不能随即位置访问,删除数据不会造成大量数据移动,性能较好,底层应该是链表实现。

#include <iostream>
#include <list>

std::list<double> l;
l.push_back(1.0);
l.push_back(2.0);
l.push_back(3.0);

typedef std::list<double>::const_iterator list_iterator;

for (list_iterator i = l.begin(); i != l.end(); i++) {
    std::cout << *i << std::endl;
}

for (list_iterator i = l.begin(); i != l.end(); i++) {
    if (*i == 2.0) {
        l.erase(i);
    }
}

for (list_iterator i = l.begin(); i != l.end(); i++) {
    std::cout << *i << std::endl;
}
2017-02-15 09:33322