CS106L Standard C++ Programming (施工中)
philosophies of C++ design
- 程序员拥有完全的控制权,并需要对此负责
- 在代码中直接表达思想和意图
- 尽可能在编译时强制执行安全性
- 不浪费空间和时间
- 将杂乱的特性模块化
- 向下兼容
stream
std::ostringstream 定义一个写缓冲区,采用 << 从缓存区指针处写入字符串覆盖
std::istringstream 定义一个读缓存区,采用 >> 依据右变量的类型,从缓冲区指针开始读入并进行类型转换。更具体地说,指针会一直读取并向后移动直到遇到空白或制表符,然后指针重新指向空白或制表符的前一个位置。下一次进行缓存区读时,指针会跳过所有空白和制表符,直到下一个字符
事实上,std::istringstream是一种 std::istream,而 std::cin 是一个 std::istream类型的对象,std::cout同理
使用缓冲区而不是立即输出,避免了系统调用读写的昂贵开销,但 std::cerr是不使用缓存区直接输出
缓冲区的状态:Good/Fail/EOF/Bad bit,可通过一个缓冲区的成员函数进行访问 如.good()
当尝试读入的类型于缓存区中识别的类型不一致时,fail位会被设置为1,并且此后对该缓冲区的读入都会被冻结
modern C++ data type
类型别名 eg: using iter = std::vector <int>::iterator
auto 编译器从初值赋值自动推断类型 注意:用 const为 auto变量赋初值的时候不会有常量性
std::tuple类似 std::pair,用来表示多元组,通过 get<i>(x)访问多元组 x的第 i个元素,类似语法通过 set来设置元素的值
统一初始化:按照结构体中变量定义的顺序使用花括号进行初始化
STL
ez
template
C++ 使用 template 实现了类似泛型编程的功能
对于模板函数,可以使用 template <class T> 声明使用了类型为 T的参数
在编译的时候,编译器会对应不同的类型进行实例化,替换生成对应类型的函数;你也可以手动进行实例化 mymax<int>(114,514)加快编译速度
同样的,自定义的函数也可以作为模板函数的参数。注意在C++标准库中,部分模板函数只接受谓词函数,即返回布尔值的函数
lambda 函数:创建的是一个对象,但是表现得像一个轻量级函数,其声明如下
auto fun = [capture-clause](parameters)->return-value{//body};
编译器实际上会把它转化成一个类,由于这个类的名称未知,需要使用 auto
其中的 capture-clause 规定了该lambda 函数能够捕获的外部变量

浙公网安备 33010602011771号