新黑马 STL
C++11进阶STL相关内容
Scarlett2025
种一棵树最好的时间是十年前,其次是现在。——非洲经济学家Dambisa Moyo《dead aid》
展开
-
常用集合算法
10.1 set_intersection算法 求两个set集合的交集10.2 set_union算法 求两个set集合的并集10.3 set_difference算法 求两个set集合的差集set_intersectionvoid test01() { vector<int>v1; vector<int>v2; for (int i = 0; i < 10; ++i) { v1.push_back(i); v2.push_back(i + 5);原创 2021-11-15 10:40:15 · 1178 阅读 · 0 评论 -
常用算数生成算法
9.1 头文件 #include < numeric>9.2 accumulate 累加算法9.3 fill 填充#include<numeric>#include<iterator>accumulatevoid test01() { vector<int>v; for (int i = 0; i <= 100; ++i) { v.push_back(i); } //0~100累计和5050 //第三个参数 起始累加值原创 2021-11-14 20:01:15 · 653 阅读 · 0 评论 -
常用拷贝和替换算法
8.1 copy 复制 目标容器有容量8.2 replace 替换 按值替换8.3 replace _if 按条件替换8.4 swap 交换copy#include<iterator>void test01() { vector<int>v; for (int i = 0; i < 10; ++i) { v.push_back(i); } vector<int>vTarget; vTarget.resize(v.size()原创 2021-11-14 19:34:10 · 629 阅读 · 0 评论 -
常用排序算法
7.1 merge 合并7.1.1 将两个有序的容器 合并到另一个容器中,合并后依然是有序7.1.2 目标容器要有容量7.2 sort 7.2.1 排序7.3 random_shuffle 洗牌7.4 reverse 反转mergevoid test01() { vector<int>v1; vector<int>v2; for (int i = 0; i < 10; ++i) { v1.push_back(i + 100); v2.push原创 2021-11-13 22:29:28 · 241 阅读 · 0 评论 -
常用查找算法
1.1 find 按值查找 1.2 find_if 按条件进行查找1.3 adjacent_find算法 查找相邻重复元素1.4 binary_search算法 二分查找法1.4.1 有序序列1.5 count 按值统计1.6 count_if 按条件统计findvoid test01() { vector<int>v; for (int i = 0; i < 10; ++i) { v.push_back(rand() % 100); } for_eac原创 2021-11-13 19:36:20 · 536 阅读 · 0 评论 -
常用遍历算法
5.1 for_each 主要功能:遍历5.2 有返回值 5.3 可以绑定参数 进行输出 (适配器)5.4 transform 搬运 ,目标容器 要有容量原创 2021-11-13 17:50:16 · 660 阅读 · 0 评论 -
适配器使用
4.1 函数对象适配器4.1.1 bind2nd 或者 bind1st 将两个参数进行绑定4.1.1.1 bind2nd 绑定顺序是一致4.1.2 继承 binary_function<类型1 ,类型2 ,返回值类型>4.1.3 加 const4.2 取反适配器4.2.1 一元取反 not14.2.1.1 继承 unary_function<类型1 ,返回值类型>4.2.1.2 加const4.2.2 二元取反 not24.3 函数指针适配器4.原创 2021-11-12 14:13:18 · 408 阅读 · 0 评论 -
内建函数对象使用
3.1 template<class T> T negate<T>//取反仿函数3.2 template<class T> T plus<T>//加法仿函数3.3 template<class T> bool greater<T>//大于3.4 头文件 #include < functional >void test01() { //template<class T> T negate<T&g原创 2021-11-11 14:53:20 · 120 阅读 · 0 评论 -
谓词的使用
2.1 普通函数 或者仿函数 返回值 是 bool类型,这样的函数或者仿函数称为谓词2.2 一元谓词2.2.1 找容器中第一个大于20的数字 find_if2.3 二元谓词2.3.1 对容器进行排序 sortclass LargeThan20 {public: bool operator()(int val) { return val > 20; }};//一元谓词void test01() { vector<int>v; for (int i =原创 2021-11-11 14:16:41 · 284 阅读 · 0 评论 -
函数 对象
1.1 函数对象通常不定义构造函数和析构函数,所以在构造和析构时不会发生任何问题,避免了函数调用的运行时问题。1.2 函数对象超出普通函数的概念,函数对象可以有自己的状态1.3 函数对象可内联编译,性能好。用函数指针几乎不可能1.4 模版函数对象使函数对象具有通用性,这也是它的优势之一 1.5 可以作为函数参数 传递...原创 2021-11-11 11:58:38 · 94 阅读 · 0 评论 -
map容器
5.1 关联式容器,key 和 value 每个元素都是对组5.2 插入 4种方式 5.2.1 m.insert( pair<int,int>(1,1) )5.2.2 m.insert( make_pair(2,2) )5.2.3 m.insert(map<int,int>::value_type(3,3) )5.2.4 m[4] = 45.3 find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();5.4 c原创 2021-11-09 13:43:32 · 387 阅读 · 0 评论 -
set容器
4.1 关联式容器,内部插入数据时候自动排序4.2 set容器 不允许插入重复的key值4.3 删除 erase(key)4.4 find 查找 查找容器中是否有响应的key的数据,如果有返回迭代器,没有返回end的位置4.5 count 统计 统计key的个数,对于set而言,结果要么是0,要么是14.6 lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。4.7 upper_bound(keyElem);//返回第一个key>key原创 2021-11-08 23:07:48 · 896 阅读 · 0 评论 -
list容器
3.1 双向循环链表3.2 赋值、构造3.3 删除 remove(elem) 删除容器中所有与elem匹配的元素3.4 反转 reverse3.5 排序 sort3.5.1 默认从小到大3.5.2 对于自定义数据类型 ,必须要指定排序规则3.5.3 案例 给葫芦娃高级排序list构造函数list<T> lstT;//list采用采用模板类实现,对象的默认构造形式:list(beg,end);//构造函数将[beg, end)区间中的元素拷贝给本身。list(n,el原创 2021-11-06 15:14:43 · 95 阅读 · 0 评论 -
queue队容器
2.1 符合先进先出数据结构2.2 对外接口2.3 构造、赋值2.4 大小 size2.5 是否为空 empty2.6 队头 front2.7 队尾 back2.8 入队 push2.9 出队 pop2.10 不提供遍历功能,没有迭代器queue构造函数queue<T> queT;//queue采用模板类实现,queue对象的默认构造形式:queue(const queue &que);//拷贝构造函数queue存取、插入和删除操作push原创 2021-11-05 11:40:56 · 91 阅读 · 0 评论 -
stack栈容器
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>#include <stack>#include <cstdlib>using namespace std;void test01() { stack<int>s; for (int i = 0; i < 5; ++i) { //入栈 s.push(rand() % 10); }原创 2021-11-05 11:10:04 · 226 阅读 · 0 评论 -
deque容器
5.1 双端数组 没有容量 内部用中控器控制连续分段空间5.2 可以对头部进行插入删除5.3 和vector的测试接口差不多5.4 不同 头部插入 push_front 头部 删除 pop_frontvoid printDeque(deque<int> &d) { // iterator 普通迭代器 // reverse_iterator 反转迭代器 // const_iterator 只读迭代器 for (deque<int>::const_i原创 2021-11-04 22:27:22 · 91 阅读 · 0 评论 -
vector容器
动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间void test() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); cout << v.capacity() << " "; } cout << endl;}...原创 2021-11-03 23:24:30 · 90 阅读 · 0 评论 -
文件的读写操作
12.1 写文件12.1.1 ofstream ofs12.1.2 open 指定打开方式12.1.3 isopen 判断是否打开成功12.1.4 ofs << “数据”12.1.5 ofs.close12.2 读操作12.2.1 ifstream ifs12.2.2 指定打开方式 ios::in12.2.3 isopen判断是否打开成功12.2.4 三种方式读取数据写文件void test01(){ //以输出的方式打开文件 //ofstream ofs("原创 2021-11-01 17:56:26 · 237 阅读 · 0 评论 -
标准输出流
cout.put() //向缓冲区写字符cout.write() //从buffer中写num个字节到当前输出流中。void test01(){// cout.put('a').put('b'); char buf[1024] = "hellowrold"; cout.write(buf, strlen(buf));}11.1 流对象的成员函数11.1.1 int number = 99;11.1.2 cout.width(20);11.1.3 cout.fill(’*’);原创 2021-11-01 17:32:21 · 156 阅读 · 0 评论 -
标准输入流案例
10.1 判断用户输入的是字符串还是数字 利用偷窥 或者 放回10.2 让用户输入指定范围内的数字,如果不正确 重新输入10.2.1 cin.fail() 看标志位 0正常 1不正常10.2.2 cin.clear()重置标志位10.2.3 cin.syne() 清空缓冲区案例1 判断用户的是字符串 还是数字#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>#include <c原创 2021-11-01 17:13:09 · 137 阅读 · 0 评论 -
标准输入流
9.1 cin.get 缓冲区中读取一个字符9.2 cin.get(两个参数) 不读换行符9.3 cin.getline () 读取换行 并且扔掉9.4 cin.ignore 忽略 (N) N代表忽略字符数9.5 cin.peek 偷窥 偷看1个字符然后放回去9.6 cin.putback 放回 把字符放回缓冲区#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using name原创 2021-11-01 14:50:54 · 144 阅读 · 0 评论 -
编写自己的异常类
8.1 自己的异常类 需要继承于 exception8.2 重写 虚析构 what()8.3 内部维护以错误信息 字符串8.4 构造时候传入 错误信息字符串,what返回这个字符串8.5 string 转 char * .c_str();#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class myException :publi原创 2021-11-01 12:05:11 · 609 阅读 · 0 评论 -
使用系统标准异常
7.1 #incldue 7.2 throw out_of_range(”aaa”) 。。。7.3 catch(out_of_range & e) cout << e.what();#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>#include<stdexcept>//系统提供标准异常 要包含头文件using namespace std;cla原创 2021-11-01 11:48:46 · 115 阅读 · 0 评论 -
异常的多态使用
6.1 利用多态来实现 printError同一个接口调用6.2 抛出不同的错误对象,提示不同错误#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class BaseException {public: virtual void printError() = 0;};class NullPointerException :public Ba原创 2021-11-01 11:11:34 · 112 阅读 · 0 评论 -
异常变量生命周期
5.1 如果 MyException e,会多开销一份数据 ,调用拷贝构造5.2 如果 MyExcepiton *e , 不 new提前释放对象 new 自己管理delete5.3 推荐 MyException &e 容易些 而且 就一份数据MyException e#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;#if(0)原创 2021-10-29 22:50:04 · 123 阅读 · 0 评论 -
异常的接口声明
4.1 如果想抛出特定的类型异常 ,可以利用异常的接口声明4.2 void func() throw ( int) 只能抛出 int类型4.3 throw() 不抛出任何类型异常#include "mainwindow.h"#include <QApplication>#include<QDebug>//异常的接口声明//void func()throw(int) 不抛出任何类型异常void func()throw(int){ //只抛出int类型异常 t原创 2021-10-29 22:24:06 · 321 阅读 · 0 评论 -
异常的基本使用/对自定义异常进行捕获/栈解旋
2.1 try 试图执行 try{}中的内容2.2 在可能出现异常的地方 抛出异常 throw2.3 try下面 catch捕获异常2.4 catch( 捕获类型 ) …代表 所有其他类型2.5 如果不想处理异常,继续向上抛出 throw2.6 如果没有任何处理异常的地方,那么成员调用terminate函数,中断程序2.7 自定义异常类 ,可以抛出自定义的对象 ,捕获自定义的异常3.1 从try开始 到 throw 抛出异常之前 所有栈上的对象 都会被释放 这个过程称为栈解旋3.原创 2021-10-29 18:00:43 · 225 阅读 · 0 评论 -
类模板的应用-数组类的封装
1原创 2021-10-28 22:49:08 · 111 阅读 · 0 评论 -
数据类型转换
1.1 静态转换 static_cast1.2 使用方式 static_cast< 目标类型>(原始数据)1.3 可以进行基础数据类型转换1.4 父与子类型转换1.5 没有父子关系的自定义类型不可以转换1.6 动态转换 dynamic_cast1.7 不可以转换基础数据类型1.8 父子之间可以转换1.8.1 父转子 不可以1.8.2 子转父 可以1.8.3 发生多态 都可以1.9 常量转换 const_cast1.10 不能对非指针或者非引用进行转换1.11 重新解释原创 2021-10-26 21:39:57 · 135 阅读 · 0 评论 -
友元碰到类模板
9.1 友元函数类内实现9.2 friend void printPerson( Person<T1 ,T2> & p )9.3 友元函数类外实现9.4 friend void printPerson<>(Person<T1, T2> & p); //没有<>普通函数 声明 加上 <>模板函数声明9.5 让编译器看到 函数 并且看到这个Person类型#define _CRT_SECURE_NO_WARNINGS#in原创 2021-10-26 17:18:04 · 90 阅读 · 0 评论 -
类模板的分文件编写问题以及解决
8.1 .h .cpp分别写声明和实现8.2 但是由于 类模板的成员函数运行阶段才去创建,导致包含.h头文件,不会创建函数的实现,无法解析外部命令8.3 解决方案 保护 .cpp文件 (不推荐)8.4 不要进行分文件编写,写到同一个文件中,进行声明和实现,后缀名改为.hpp8.5 约定俗成的main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>#include "Modul原创 2021-10-26 16:45:20 · 196 阅读 · 0 评论 -
类模板的类外实现成员函数
template <class T1, class T2>Person<T1, T2>::Person(T1 name, T2 age)#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;template<class T1,class T2>class Modulator {public: Modulator(原创 2021-10-26 16:31:54 · 468 阅读 · 0 评论 -
类模板碰到继承的问题以及解决
6.1 基类如果是模板类,必须让子类告诉编译器 基类中的T到底是什么类型6.2 如果不告诉,那么无法分配内存,编译不过6.3 利用参数列表class Child :public Base< int>#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;template<class T>class Base {public:原创 2021-10-26 16:08:18 · 210 阅读 · 0 评论 -
类模板做函数的参数
5.1 三种方式5.1.1 显示指定类型5.1.2 参数模板化5.1.3 整体模板化5.2 查看类型名称5.2.1 cout << typeid(T).name() << endl;#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;template<class T1,class T2>class Modul原创 2021-10-26 15:32:14 · 207 阅读 · 0 评论 -
类模板的基本使用
4.1 写法template <T…> 紧跟着是类4.2 与函数模板区别,可以有默认类型参数4.3 函数模板可以进行自动类型推导,而类模板不可以4.4 类模板中的成员函数 一开始不会创建出来,而是在运行时才去创建#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;//类模板template<class T1,class T2=in原创 2021-10-26 13:46:44 · 1250 阅读 · 0 评论 -
函数模板的局限性
3.1 模板不能解决所有的类型3.2 如果出现不能解决的类型,可以通过第三地具体化来解决问题3.3 template<> 返回值 函数名<具体类型>(参数)#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Bachelor {public: Bachelor(string name, int age) {原创 2021-10-26 11:37:38 · 156 阅读 · 0 评论 -
函数模板与普通函数的区别以及调用规则
2.1 区别 普通函数可以进行隐式类型转换 模板不可以2.2 调用规则2.2.1 c++编译器优先考虑普通函数2.2.2 可以通过空模板实参列表的语法限定编译器只能通过模板匹配2.2.3 函数模板可以像普通函数那样可以被重载2.2.4 如果函数模板可以产生一个更好的匹配,那么选择模板#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;//1 普原创 2021-10-26 10:49:08 · 306 阅读 · 0 评论 -
课堂练习-实现通用的数组排序
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;template<class T>void mySwap(T &a, T &b) { T temp = a; a = b; b = temp;}template<class T>void selection_sort(T arr[], int len原创 2021-10-25 21:24:54 · 101 阅读 · 0 评论 -
函数模板基本使用
1.1 template < class / typename T> 告诉编译器紧跟的代码里出现T不要报错1.2 mySwap( T &a T &b ) 类型也需要传入 ,类型参数化1.3 myswap(a,b) 自动类型推导 按照a b的类型 来替换T1.4 myswap< int>(a,b) 显示指定类型#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<str原创 2021-10-25 20:51:16 · 136 阅读 · 0 评论 -
STL三大组件基本使用
vector存放内置数据类型头文件#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>#include<vector> //容器#include<algorithm> //使用系统算法的头文件using namespace std;void print(int v) { cout << v << " ";}void test02原创 2021-09-25 19:45:40 · 78 阅读 · 0 评论