C++把输入输出抽象为“流”:程序按照顺序从流中提取数据,或把数据插入流。键盘、终端、文件和内存字符串虽然介质不同,却可以使用相似的状态、格式和运算符接口。
本文从流与缓冲区讲起,系统整理cin、cout、cerr、clog、文件流和字符串流,并重点解释输入失败后的状态恢复、>>与getline混用、文本和二进制文件差异,以及原始结构体二进制写入 ...
模板初阶解决“同一份逻辑适配不同类型”,模板进阶则开始解决两个更精细的问题:把编译期常量也作为参数,以及为特定类型或类型形态选择更合适的实现。类型萃取、标准容器、智能指针和泛型算法都大量依赖这些机制。
本文以C++11为主要标准,系统讲解非类型模板参数、函数模板特化、类模板全特化与偏特化、类型萃取和模板分离编译,并纠正常见的术语与版本差异。
一、模板参数 ...
stack、queue和priority_queue不以完整容器接口呈现,而是通过限制底层容器的操作,分别形成后进先出、先进先出和按优先级访问的数据结构。理解它们的关键是“容器适配器”:存储工作由底层容器完成,适配器负责提供受约束的接口和语义。
本文系统介绍三种适配器的接口、复杂度、底层容器要求、比较器规则、deque结构,以及最小栈、逆波兰表达式和第K大元 ...
std::list是节点式双向链表。它不提供随机访问,却能在已知位置以常数复杂度插入、删除和转移节点,并且结构修改通常不会让其他节点的迭代器失效。
本文从list的接口与复杂度讲到哨兵节点、双向迭代器和迭代器失效,并与vector进行工程化比较。文末通过一个教学版双向链表展示节点链接、插入、删除和迭代器封装。
一、list的结构与特点std::list& ...
std::vector是C++最常用的序列容器。它以连续内存保存元素,兼具随机访问、良好缓存局部性和摊销常数时间尾插。真正掌握vector,不仅要会调用push_back,还要理解size与capacity、扩容、元素搬移、迭代器失效以及为什么不能用memcpy复制一般对象。
本文从常用接口讲到实现原理,并给出一个基于分配器的教学版动态数组,以观察原始存储、 ...
std::string把字符序列、动态存储、长度管理和常用字符串操作封装在一个值类型中。它比C风格字符数组更容易复制、拼接、查找和传递,但仍需正确理解size、capacity、reserve、resize、c_str以及迭代器失效等规则。
本文系统整理std::string的构造、遍历、容量、修改、查找、截取、输入和C接口兼容方式,并通过一个教学版字符串类 ...
STL将常用数据结构和算法抽象成可复用组件,使程序员不必为每个项目重复实现动态数组、链表、排序、查找等基础设施。学习STL不能只停留在背接口,更重要的是理解容器的结构、算法的复杂度、迭代器的能力以及操作后的失效规则。
本文介绍STL的定位、六大组件及协作关系,梳理常用容器的选择原则、复杂度意识、线程安全边界和分阶段学习路线,并用一个可直接编译的示例演示容器、 ...
当多个函数或类只有“所处理的数据类型”不同,逐份复制代码不仅低效,还容易让各版本的行为逐渐失去一致。C++模板把类型或编译期常量变成参数,让编译器根据实际使用生成对应代码,是标准库容器、算法、智能指针等设施的重要基础。
本文从泛型编程出发,系统整理函数模板的定义、模板实参推导、显式模板实参、重载匹配规则,以及类模板的定义、实例化、类外成员实现和代码组织方式。 ...
内存管理贯穿C与C++程序的整个生命周期。变量存放在哪里、对象何时开始存在、动态内存由谁释放、构造失败时怎样回收空间,这些问题直接影响程序的正确性、性能与稳定性。
本文从进程虚拟地址空间讲起,系统比较malloc/calloc/realloc/free与new/delete,分析operator new/operator delete、对象数组、定位new、 ...
类与对象的基础语法并不复杂,真正影响代码质量的是对象如何初始化、共享状态如何组织、类之间如何协作,以及哪些实现细节应该隐藏。
本文继续深入C++类与对象,重点讲解构造函数体赋值与初始化列表的区别、成员初始化顺序、explicit、静态数据成员和静态成员函数、C++11默认成员初始化器、友元函数、友元类、嵌套类及封装设计。
一、再次理解对象初始化1.1 构 ...
