c++
相遇皆是缘分
从C到C++
动态内存分配(new)
1 | //用“new”动态分配的内存空间,一定要用“delete”运算符进行释放,否则无法释放,delete会调用析构函数 |
内联函数(了解)
1 | // 在函数定义前面加 “inline” 关键字,即可定义内联函数 |
函数重载
1 | // 一个或多个函数,名字相同,然后参数个数或参数类型不相同,这叫做函数的重载 |
类和对象
访问权限
1 | /* |
构造函数和析构函数
1 | 构造函数 |
复制构造函数
1 |
|
类型转换构造函数
1 | /* |
类和对象提高
静态成员变量
1 | 1.普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享,全局。 |
成员对象和封装类
1 | class A { |
初始化列表
初始化列表
1 | 【初始化列表调用父类的构造函数】 |
常量对象 和 常量成员函数
1 | 【常量对象】 |
友元
1 | // friend :允许使用 private(私有)的变量或函数 |
运算符重载
成员函数方式
1 | 定义: operator 运算符符号 |
全局函数方式
1 | 定义: operator 运算符符号 |
赋值运算符重载
1 | class Distance |
继承
继承和派生
1 | //写法 class 派生类名 : public 基类名 |
重写
1 | class A { |
多层继承
1 | class Grandpa { |
多继承
1 | class Father { |
多态
多态实现的关键—虚函数表
虚函数
1 | 前面有 virtual 关键字的成员函数就是 虚函数 |
虚函数表
1 | 1.多态的函数调用语句被编译成一系列根据类指针所指向的对象中存放的虚函数表的地址,在虚函数表中查找虚函数地址并调用虚函数的指令 |
虚析构函数
1 |
|
纯虚函数、抽象类
1 | 包括 纯虚函数 的类叫 抽象类 |
输入输出和模板
输入输出相关类
1 | 【标准流对象】 |
流操纵算子
头文件 #include
1 | 整数流的基数:流操纵算子 dec(十进制) , oct(八进制) , hex(十六进制) , setbase(任意进制) |
文件读写
头文件 #include
创建文件
1 | 方式一: |
文件的读写指针
1 | 【写】 |
字符/文本文件读写
1 | 写一个程序,将文件 in.txt 里面的整数排序后,输出到out.txt |
二进制文件读写
1 | ifstream 和 fstream的成员函数 |
函数模板
1 | template <class 类型参数1,class 类型参数2,...> |
1 | 【求数组最大元素】 通过参数实例化函数模板 |
类模板
1 | template <class 类型参数1,class 类型参数2,...> //类型参数表 |
1 | 类模板示例: Pair类模板 |
类模板与派生/友元/静态成员变量
标准模板库STL
String类
头文件
常见构造
| 函数名称 | 功能说明 |
|---|---|
string() | 构造空的string类对象,即空字符串 |
string(const char* s) | 用C风格字符串string来构造string类对象 |
string(size_t n, char c) | string类对象中包含n个字符c |
string(const string&s) | 拷贝构造函数 |
string(const string&s, size_t n) | 用s中的前n个字符构造新的string类对象 |
1 | void TestString(){ |
容量操作
| 函数名称 | 功能说明 |
|---|---|
| size (重点) | 返回字符串有效字符长度 |
| length | 返回字符串有效字符长度 |
| empty (重点) | 检测字符串释放为空串,是返回true,否则返回****false |
| clear (重点) | 清空有效字符 |
| reserve (重点) | 为字符串预留空间 |
| resize (重点) | 将有效字符的个数该成 n 个,多出的空间用字符 c 填充 |
| capacity | 返回空间总大小 |
1 | // 测试string容量相关的接口 |
访问及遍历操作
| 函数名称 | 功能说明 |
|---|---|
| operator[ ] (重点) | 返回 pos 位置的字符, const string 类对象调用 |
| begin + end | begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器 |
| rbegin + rend | begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器**** |
| 范围 for | C++11 支持更简洁的范围 for 的新遍历方式 |
1 | // string的遍历 |
修改操作
| 函数名称 | 功能说明 |
|---|---|
| push_back | 在字符串后尾插字符 c |
| append | 在字符串后追加一个字符串 |
| operator+= ( 重点 ) | 在字符串后追加字符串 str |
| c_str ( 重点 ) | 返回 C 格式字符串 |
| find + npos ( 重点 ) | 从字符串 pos 位置开始往后找字符 c ,返回该字符在字符串中的位置 |
| rfind | 从字符串 pos 位置开始往前找字符 c ,返回该字符在字符串中的位置 |
| substr | 在 str 中从 pos 位置开始,截取 n 个字符,然后将其返回 |
1 | void Teststring5() |
常用方法
[C++string类常用方法_c++ string类的常用方法-CSDN博客](https://blog.csdn.net/qq_40644809/article/details/108977918?ops_request_misc={"request_id"%3A"171297534816800178590165"%2C"scm"%3A"20140713.130102334.pc_all."}&request_id=171297534816800178590165&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-2-108977918-null-null.142^v100^pc_search_result_base3&utm_term=c%2B%2B string&spm=1018.2226.3001.4187)
[C++中的String的常用函数用法总结_string函数-CSDN博客](https://blog.csdn.net/qq_37941471/article/details/82107077?ops_request_misc={"request_id"%3A"171297534816800178590165"%2C"scm"%3A"20140713.130102334.pc_all."}&request_id=171297534816800178590165&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-11-82107077-null-null.142^v100^pc_search_result_base3&utm_term=c%2B%2B string&spm=1018.2226.3001.4187)
标准模板库STL概述
1 | 容器:可容纳各种数据类型的通用数据结构,是类模板 |
容器
1 | 可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模版,分为三种: |
顺序容器和关联容器中都有的成员函数
| begin | 返回指向容器中第一个元素的迭代器 |
|---|---|
| end | 返回指向容器中最后一个元素后面的位置的迭代器 |
| rbegin | 返回指向容器中最后一个元素的迭代器 |
| rend | 返回指向容器中第一个元素前面的位置的迭代器 |
| erase | 从容器中删除一个或几个元素 |
| clear | 从容器中删除所有元素 |
顺序容器的常用成员函数
| front | 返回容器中第一个元素的引用 |
|---|---|
| back | 返回容器中最后一个元素的引用 |
| push_back | 在容器末尾增加新元素 |
| pop_back | 删除容器末尾的元素 |
| erase | 删除迭代器指向的元素(可能会使该迭代器失效),或删除一个区间,返回被删除元素后面的那个元素的迭代器 |
迭代器
1 | 用于指向顺序容器和关联容器中的元素 |
1 | '双向迭代器' |
| 容器 | 容器上的迭代器类别 |
|---|---|
| vector | 随机访问 |
| deque | 随机访问 |
| list | 双向 |
| set/multiset | 双向 |
| map/multimap | 双向 |
| stack | 不支持迭代器 |
| queue | 不支持迭代器 |
| priority_queue | 不支持迭代器 |
1 | vector的迭代器是随机迭代器, |
算法
头文件:
find()
1 | template<class InIt, class T> |
相等
1 | class A { |
vector / deque 和 list
vector
1 | 【vector】 |
deque
1 | 【deque】 |
list
1 | 【list】 |
函数对象
1 | 是个对象,但是用起来看上去像函数调用,实际上也执行了函数调用。 |
关联容器
关联容器适合用于不断更新容器,不断查询容器
set和multiset
头文件
| multiset的成员函数 | |
|---|---|
| iterator find(const T & val); | 在容器中查找值为val的元素,返回其迭代器。如果找不到,返回end()。 |
| iterator insert(const T & val); | 将val插入到容器中并返回其迭代器。 |
| void insert( iterator first,iterator last); | 将区间[first,last)插入容器。 |
| int count(const T & val); | 统计有多少个元素的值和val相等。 |
| iterator lower_bound(const T & val); | 查找一个最大的位置 it,使得[begin(),it) 中所有的元素都比 val 小。 |
| iterator upper_bound(const T & val); | 查找一个最小的位置 it,使得[it,end()) 中所有的元素都比 val 大。 |
| pair<iterator,iterator> equal_range(const T & val); | 同时求得lower_bound和upper_bound。 |
| iterator erase(iterator it); | 删除it指向的元素,返回其后面的元素的迭代器(Visual studio 2010上如此,但是在C++标准和Dev C++中,返回值不是这样)。 |
1 |
|
map和multimap
头文件
1 | map/multimap容器里放着的都是pair模版类的对象,且按first从小到大排序 |
容器适配器
1 | 【stack】 |
| stack , queue , priority_queue 都有的成员函数 | |
|---|---|
| empty() | 成员函数用于判断适配器是否为空 |
| size() | 成员函数返回适配器中元素个数 |
算法
1 | STL中的算法大致可以分为以下七类: |
1. 不变序列算法
| 算法名称 | 功能 |
|---|---|
| min | 求两个对象中较小的(可自定义比较器) |
| max | 求两个对象中较大的(可自定义比较器) |
| min_element | 求区间中的最小值(可自定义比较器) |
| max_element | 求区间中的最大值(可自定义比较器) |
| for_each | 对区间中的每个元素都做某种操作 |
| count | 计算区间中等于某值的元素个数 |
| count_if | 计算区间中符合某种条件的元素个数 |
| find | 在区间中查找等于某值的元素 |
| find_if | 在区间中查找符合某条件的元素 |
| find_end | 在区间中查找另一个区间最后一次出现的位置(可自定义比较器) |
| find_first_of | 在区间中查找第一个出现在另一个区间中的元素 (可自定义比较器) |
| adjacent_find | 在区间中寻找第一次出现连续两个相等元素的位置(可自定义比较器) |
| search | 在区间中查找另一个区间第一次出现的位置(可自定义比较器) |
| search_n | 在区间中查找第一次出现等于某值的连续n个元素(可自定义比较器) |
| equal | 判断两区间是否相等(可自定义比较器) |
| mismatch | 逐个比较两个区间的元素,返回第一次发生不相等的两个元素的位置( 可自定义比较器) |
| lexicographical_compare | 按字典序比较两个区间的大小(可自定义比较器) |
1 | 1.此类算法不会修改算法所作用的容器或对象 |
2. 变值算法
1 | 此类算法会修改源区间或目标区间元素的值。 |
| 算法名称 | 功能 |
|---|---|
| for_each | 对区间中的每个元素都做某种操作 |
| copy | 复制一个区间到别处 |
| copy_backward | 复制一个区间到别处,但目标区前是从后往前被修改的 |
| transform | 将一个区间的元素变形后拷贝到另一个区间 |
| swap_ranges | 交换两个区间内容 |
| fill | 用某个值填充区间 |
| fill_n | 用某个值替换区间中的n个元素 |
| generate | 用某个操作的结果填充区间 |
| generate_n | 用某个操作的结果替换区间中的n个元素 |
| replace | 将区间中的某个值替换为另一个值 |
| replace_if | 将区间中符合某种条件的值替换成另一个值 |
| replace_copy | 将一个区间拷贝到另一个区间,拷贝时某个值要换成新值拷过去 |
| replace_copy_if | 将一个区间拷贝到另一个区间,拷贝时符合某条件的值要换成新值拷过去 |
3. 删除算法
| 算法名称 | 功能 |
|---|---|
| remove | 删除区间中等于某个值的元素 |
| remove_if | 删除区间中满足某种条件的元素 |
| remove_copy | 拷贝区间到另一个区间。等于某个值的元素不拷贝 |
| remove_copy_if | 拷贝区间到另一个区间。符合某种条件的元素不拷贝 |
| unique | 删除区间中连续相等的元素,只留下一个(可自定义比较器) |
| unique_copy | 拷贝区间到另一个区间。连续相等的元素,只拷贝第一个到目标区间 (可自定义比较器) |
4. 变序算法
1 | 变序算法改变容器中元素的顺序,但是不改变元素的值。 |
| 算法名称 | 功能 |
|---|---|
| reverse | 颠倒区间的前后次序 |
| reverse_copy | 把一个区间颠倒后的结果拷贝到另一个区间,源区间不变 |
| rotate | 将区间进行循环左移 |
| rotate_copy | 将区间以首尾相接的形式进行旋转后的结果拷贝到另一个区间,源区间不变 |
| next_permutation | 将区间改为下一个排列(可自定义比较器) |
| prev_permutation | 将区间改为上一个排列(可自定义比较器) |
| random_shuffle | 随机打乱区间内元素的顺序 |
| partition | 把区间内满足某个条件的元素移到前面,不满足该条件的移到后面 |
| stable_patition | 把区间内满足某个条件的元素移到前面,不满足该条件的移到后面。而且对这两部分元素,分别保持它们原来的先后次序不变 |
| random_shuffle | template void random_shuffle(RanIt first, RanIt last); 随机打乱[first,last) 中的元素,适用于能随机访问的容器。 |
| reverse | template void reverse(BidIt first, BidIt last); 颠倒区间[first,last)顺序 |
| next_permutation | template bool next_permutaion (Init first,Init last); 求下一个排列 |
5. 排序算法
1 | 排序算法比前面的变序算法复杂度更高,一般是O(n×log(n))。排序算法需要随机访问迭代器的支持,因而不适用于关联容器和list。 |
| 算法名称 | 功能 |
|---|---|
| sort | 将区间从小到大排序(可自定义比较器)。 |
| stable_sort | 将区间从小到大排序,并保持相等元素间的相对次序(可自定义比较器)。 |
| partial_sort | 对区间部分排序,直到最小的n个元素就位(可自定义比较器)。 |
| partial_sort_copy | 将区间前n个元素的排序结果拷贝到别处。源区间不变(可自定义比较器)。 |
| nth_element | 对区间部分排序,使得第n小的元素(n从0开始算)就位,而且比它小的都在它前面,比它大的都在它后面(可自定义比较器)。 |
| make_heap | 使区间成为一个“堆”(可自定义比较器)。 |
| push_heap | 将元素加入一个是“堆”区间(可自定义比较器)。 |
| pop_heap | 从 “堆”区间删除堆顶元素(可自定义比较器)。 |
| sort_heap | 将一个“堆”区间进行排序,排序结束后,该区间就是普通的有序区间,不再是 “堆”了(可自定义比较器)。 |
| partial_sort | 部分排序,直到 前 n 个元素就位即可。 |
| nth_element | 排序,直到第 n个元素就位,并保证比第n个元素小的元素都在第 n 个元素之前即可。 |
| partition | 改变元素次序,使符合某准则的元素放在前面 |
6. 有序区间算法
1 | 有序区间算法要求所操作的区间是已经从小到大排好序的,而且需要随机访问迭代器的支持。所以有序区间算法不能用于关联容器和list。 |
| 算法名称 | 功能 |
|---|---|
| binary_search | 判断区间中是否包含某个元素。 |
| includes | 判断是否一个区间中的每个元素,都在另一个区间中。 |
| lower_bound | 查找最后一个不小于某值的元素的位置。 |
| upper_bound | 查找第一个大于某值的元素的位置。 |
| equal_range | 同时获取lower_bound和upper_bound。 |
| merge | 合并两个有序区间到第三个区间。 |
| set_union | 将两个有序区间的并拷贝到第三个区间 |
| set_intersection | 将两个有序区间的交拷贝到第三个区间 |
| set_difference | 将两个有序区间的差拷贝到第三个区间 |
| set_symmetric_difference | 将两个有序区间的对称差拷贝到第三个区间 |
| inplace_merge | 将两个连续的有序区间原地合并为一个有序区间 |
| lower_bound | template<class FwdIt, class T> FwdIt lower_bound(FwdIt first, FwdIt last, const T& val); 要求[first,last)是有序的, 查找[first,last)中的,最大的位置 FwdIt,使得[first,FwdIt) 中所有的元素都比 val 小 |
| upper_bound | template<class FwdIt, class T> FwdIt upper_bound(FwdIt first, FwdIt last, const T& val); 要求[first,last)是有序的, 查找[first,last)中的,最小的位置 FwdIt,使得[FwdIt,last) 中所有的元素都比 val 大 |
| equal_range | template<class FwdIt, class T> pair<FwdIt, FwdIt> equal_range(FwdIt first, FwdIt last, const T& val); 要求[first,last)是有序的, 返回值是一个pair, 假设为 p, 则: [first,p.first) 中的元素都比 val 小 [p.second,last)中的所有元素都比 val 大 p.first 就是lower_bound的结果 p.last 就是 upper_bound的结果 |
7. 数值算法
1 | template<size_t N> |
c++ 11特性
成员变量默认初始值
1 | class B { |
auto关键字
用于定义变量,编译起可以自动判断变量的类型,需要初始化
1 | auto i = 100; // i 是 int |
decltype 关键字
求表达式的类型
1 | int i; |
基于范围的for循环
1 |
|
右值引用和MOVE语义
1 | && 右值:一般来说,不能取地址的表达式,就是右值,能取地址的,就是左值 |
无序容器(哈希表)
头文件 <unordered_map>
1 | int main() |
正则表达式
头文件
1 | int main() |
Lambda表达式
1 | 形式: |
强制类型转换
static_cast
1 | static_cast用来进用行比较“自然”和低风险的转换,比如整型和实数型、字符型之间互相转换。 |
reinterpret_cast
1 | reinterpret_cast用来进行各种不同类型的指针之间的转换、不同类型的引用之间转换、以及指针和能容纳得下指针的整数类型之间的转换。转换的时候,执行的是逐个比特拷贝的操作。 |
const_cast
1 | 用来进行去除const属性的转换。将const引用转换成同类型的非const引用,将const指针转换为同类型的非const指针时用它。例如: |
dynamic_cast
1 | dynamic_cast专门用于将多态基类的指针或引用,强制转换为派生类的指针或引用,而且能够检查转换的安全性。对于不安全的指针转换,转换结果返回NULL指针。 |
异常处理
1 | 1.一个函数运行期间可能产生异常。在函数内部对异常进行处理未必合适。因为函数设计者无法知道函数调用者希望如何处理异常。 |
用try、catch进行异常处理
1 | int main() |
bad_cast
1 | 在用dynamic_cast 进行从多态基类对象(或引用),到派生类的引用强制类型转换时 |
bad_alloc
1 | 在用new运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常。 |
out_of_range
1 | 用vector或string的at成员函数根据下标访问元素时,如果下标越界,就会抛出此异常。 |




