CS106L Standard C++ Programming (施工中)

philosophies of C++ design

  1. 程序员拥有完全的控制权,并需要对此负责
  2. 在代码中直接表达思想和意图
  3. 尽可能在编译时强制执行安全性
  4. 不浪费空间和时间
  5. 将杂乱的特性模块化
  6. 向下兼容

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 编译器从初值赋值自动推断类型 注意:用 constauto变量赋初值的时候不会有常量性

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 函数能够捕获的外部变量

posted @ 2026-01-19 13:55  Katyusha_Lzh  阅读(0)  评论(0)    收藏  举报