
C++整理
augfun
旧博客遗失,新博客凑活着用吧
展开
-
88.STL.exe
某市举行一场演讲比赛( speech_contest ),共有24个人参加。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛;第一轮分为4个小组,每组6个人。比如编号为: 100-123. 整体进行抽签(draw)后顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。第二轮分为2个小组,每组6人。比赛完毕,淘...原创 2019-09-08 17:13:16 · 141 阅读 · 0 评论 -
87.赋值运算符重载
赋值运算符重载 系统默认给类提供 赋值运算符写法 是简单值拷贝 导致如果类中有指向堆区的指针,就可能出现深浅拷贝的问题 所以要重载 = 运算符 如果想链式编程 return*thismain.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;//...原创 2019-09-08 03:40:08 · 141 阅读 · 0 评论 -
86.指针运算符重载
智能指针实现 Person类有showAge 成员函数 如果new出来的Person对象,就要让程序员自觉的去释放 delete 有了智能指针,让智能指针托管这个Person对象,对象的释放就不用操心了,让智能指针管理 为了让智能指针想普通的Person*指针一样使用 就要重载 -> 和*// 53.指针运算符重载.cpp : 定义控制台应用程序的入口...原创 2019-09-08 03:15:25 · 1671 阅读 · 1 评论 -
85.前置 后置 ++ 运算符重载
前置 后置 ++ 运算符重载 自己实现int类型 MyInteger 内部维护以int数据 MyInteger myInt myInt ++ 后置 ++myInt 前置 重载++运算符 operator++() 前置 operator++(int) 后置 前置理念 先++ 后返回自身 后置理念 先保存住原有值 内部++ 返回临时数据...原创 2019-09-08 02:55:18 · 299 阅读 · 2 评论 -
84.左移运算符重载
左移运算符重载 不要随意乱用符号重载 内置数据类型 的运算符不可以重载 cout << 直接对Person自定义数据类型 进行输出 写到全局函数中 ostream& operator<< ( ostream & cout, Person & p1 ) {} 如果重载时候想访问 p1的私有成员,那么全局函数要做...原创 2019-09-08 01:10:06 · 205 阅读 · 0 评论 -
83.加法运算符重载
定义重载的运算符就像定义函数,只是该函数的名字是operator@,这里的@代表了被重载的运算符。函数的参数中参数个数取决于两个因素。运算符是一元(一个参数)的还是二元(两个参数); 运算符被定义为全局函数(对于一元是一个参数,对于二元是两个参数)还是成员函数(对于一元没有参数,对于二元是一个参数-此时该类的对象用作左耳参数)加号运算符重载 如果想让自定义数据类型 进行+运算,那么...原创 2019-09-07 21:03:00 · 743 阅读 · 0 评论 -
82.常用排序算法
常用排序算法 merge算法 容器元素合并,并存储到另一容器中,两容器要有序,并且顺序一致 sort 排序 random_shuffle 洗牌 自己提供随机种子 reverse反转main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;#i...原创 2019-09-07 05:18:28 · 216 阅读 · 0 评论 -
81.常用查找算法
常用查找算法 find 按值查找 Person find_if 按条件查找 Person* adjacent_find算法 查找相邻重复元素 返回第一个重复元素的迭代器位置 binary_search算法 二分查找法 必须容器是有序序列 count 和count_ifmain.cpp#define _CRT_SECURE_NO_WARNINGS#...原创 2019-09-07 05:02:06 · 164 阅读 · 0 评论 -
80.遍历算法
常用遍历算法 for_each 可有有返回值 可以绑定参数进行输出 transform 将容器中的数据进行搬运到另一个容器中 注意:目标容器需要开辟空间main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include <algorithm>#include &...原创 2019-09-07 04:36:27 · 381 阅读 · 1 评论 -
79.内建函数对象
STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件 #include<functional>6个算数类函数对象,除了negate是一元运算,其他都是二元运算。template<class T> T plu...原创 2019-09-06 01:38:23 · 202 阅读 · 0 评论 -
78.谓词
谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断式。main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include <vector>#include...原创 2019-09-06 01:26:32 · 138 阅读 · 0 评论 -
77.函数对象
重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。注意:1.函数对象(仿函数)是一个类,不是一个函数。2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。分类:假定某个类有一个重载的operator(),而且重载的ope...原创 2019-09-06 00:56:43 · 124 阅读 · 0 评论 -
76.multimap容器
Multimap和map的操作类似,唯一区别multimap键值可重复。Map和multimap都是以红黑树为底层实现机制。main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include <vector>#include <string>#include <map&g...原创 2019-09-05 02:36:04 · 117 阅读 · 0 评论 -
75. map/multimap容器
Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。我们可以通过map的迭代器改变map的键值吗?答案是不行,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。Multimap和map的操作类似,唯一区别multimap键值可重复。...原创 2019-09-05 02:01:55 · 212 阅读 · 0 评论 -
74.set,multiset和pair
Set的特性是。所有元素都会根据元素的键值自动被排序。Set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。Set不允许两个元素有相同的键值。我们可以通过set的迭代器改变set元素的值吗?不行,因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说,set的iterator是一种const_iterator....原创 2019-09-04 02:45:40 · 233 阅读 · 0 评论 -
73.list
List容器是一个双向链表 List容器 赋值、构造、大小、为空、删除 、添加 移除 remove( 10 ) 删除容器中所有与10 匹配的元素 双向循环链表 迭代器是不支持随机访问的 反转排序 reverse 反转 排序 成员函数 sort 默认排序 从小到大 自定义数据类型,必须指定排序规则 高级...原创 2019-09-03 02:19:55 · 179 阅读 · 0 评论 -
72.Queue
Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。 queue 队列容器 先进先出 队头 front 队尾 back 入队 push 弹出队头 pop 大小 size...原创 2019-09-03 02:07:53 · 237 阅读 · 0 评论 -
71.stack栈容器
stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。有元素推入栈的操作称为:push,将元素推出stack的操作称为pop stack栈容器...原创 2019-09-03 02:01:00 · 121 阅读 · 0 评论 -
70.deque实现评委打分案例
需求有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。//1. 创建五名选手,放到vector中//2. 遍历vector容器,取出来每一个选手,执行for循环,可以把10个评分打分存到deque容器中//3. sort算法对deque容器中分数排序,pop_back pop_front去除最高和最低分//4. deque容器遍历一遍,...原创 2019-09-02 03:41:01 · 297 阅读 · 0 评论 -
69.deque容器
Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作deque容器 双端数组 没有容量 API 赋值、构造、大小、交换、插入 、删除 头部删除 头部插入 pop_front push_front 3种迭代器 iterator 普通 revers...原创 2019-09-02 03:06:52 · 234 阅读 · 0 评论 -
68.vector容器
Vector容器是单向开口的连续内存空间vector容器 单端数组、动态数组 构造、赋值、 大小 size 重置大小 resize 容量 capacity 是否为空 empty 交换 swap 巧用swap收缩空间 reserve 预留空间 insert 插入(迭代器) erase删除 (迭代器) clear()清空容器 pop_ba...原创 2019-09-02 02:32:31 · 155 阅读 · 0 评论 -
67.String管理
main.cpp// 46.String管理.cpp : 定义控制台应用程序的入口点。//#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;#include <string>#include <stdexcept>/*string 构造函数st...原创 2019-09-01 21:09:21 · 560 阅读 · 0 评论 -
66.三大组建
容器 vector算法 for_each 头 algorithm迭代器 iterator 每个容器有专属迭代器 vector<int >v vector<int>::iterator it = ….. v.begin() 指向第一个数据 v.end 指向 最后一个数据的下一个地址main.cpp// 45.三大组建.c...原创 2019-08-29 02:53:06 · 146 阅读 · 0 评论 -
65.C++文件读写
写文件ofstream ofsopen 指定打开方式isopen 判断是否打开成功ofs << “数据”ofs.close读操作ifstream ifs指定打开方式 ios::inisopen判断是否打开成功三种方式读取数据#define _CRT_SECURE_NO_WARNINGS#include<iostream>using names...原创 2019-08-28 02:10:08 · 237 阅读 · 0 评论 -
64.自定义异常类
编写自己的异常类自己的异常类 需要继承于 exception重写 虚析构 what()内部维护以错误信息 字符串构造时候传入 错误信息字符串,what返回这个字符串string 转 char * .c_str();main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namesp...原创 2019-08-27 03:37:49 · 146 阅读 · 0 评论 -
63.C++异常多态
异常多态main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;//异常基类class BaseException{public: virtual void printError() { }};class NullPointerException:pu...原创 2019-08-27 03:15:20 · 210 阅读 · 0 评论 -
62.C++异常
异常try 试图执行 try{}中的内容在可能出现异常的地方 抛出异常 throwtry下面 catch捕获异常catch( 捕获类型 ) …代表 所有其他类型如果不想处理异常,继续向上抛出 throw如果没有任何处理异常的地方,那么成员调用terminate函数,中断程序自定义异常类 ,可以抛出自定义的对象 ,捕获自定义的异常栈解旋从try开始 到 throw 抛出异...原创 2019-08-26 03:16:28 · 131 阅读 · 0 评论 -
61.C++类型转换
静态转换(static_cast)用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。用于基本数据类型之间的转换,如把int转换成char,把char转换成int。这种转换的安全性也要开发人员来保证静态转换 static...原创 2019-08-26 02:23:39 · 238 阅读 · 0 评论 -
60.模板类-数组封装
main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;#include "MyArray.hpp"#include <string>//输出int类型数组void printIntArray( MyArray<int>& array)...原创 2019-08-25 19:30:51 · 216 阅读 · 0 评论 -
59.模板和友元
类内实现main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include <string>using namespace std;template<class T1, class T2>class Person{ //友元函数类内实现 friend void print...原创 2019-08-25 17:20:46 · 130 阅读 · 0 评论 -
58.类模板的继承
当类模板碰到继承基类如果是模板类,必须让子类告诉编译器 基类中的T到底是什么类型如果不告诉,那么无法分配内存,编译不过利用参数列表class Child :public Base<int>main.cpp#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;templ...原创 2019-08-25 16:26:07 · 208 阅读 · 0 评论 -
57.类模板
类模板用于实现类所需数据的类型参数化范例:template<class NameType, class AgeType>class Person{public: Person(NameType name, AgeType age) { this->mName = name; this->mAge = age; } void showPerso...原创 2019-08-25 15:50:03 · 150 阅读 · 0 评论 -
56.模板局限性和解决方法
模板局限性模板不能解决所有的类型,比如数组和结构体之类的自定义类型如果出现不能解决的类型,可以通过第三地具体化来解决问题template<> 返回值 函数名<具体类型>(参数)main.cpp// 42.模板.cpp : 定义控制台应用程序的入口点。//#define _CRT_SECURE_NO_WARNINGS#include<iostre...原创 2019-08-25 03:57:05 · 228 阅读 · 0 评论 -
55.普通函数与函数模板区别
函数模板与普通函数的区别以及调用规则区别 普通函数可以进行隐式类型转换 模板不可以调用规则c++编译器优先考虑普通函数可以通过空模板实参列表的语法限定编译器只能通过模板匹配函数模板可以像普通函数那样可以被重载如果函数模板可以产生一个更好的匹配,那么选择模板模板的机制模板并不是万能的,不能通用所有的数据类型模板不能直接调用,生成后的模板函数才可以调用二次编译,第一次对模板进行编...原创 2019-08-25 03:32:04 · 182 阅读 · 0 评论 -
54.模板初识
函数模板基本使用template < class / typename T> 告诉编译器紧跟的代码里出现T不要报错mySwap( T &a, T &b ){} 类型也需要传入 ,类型参数化myswap(a,b) 自动类型推导 按照a b的类型 来替换Tmyswap<int>(a,b) 显示指定类型template<class T...原创 2019-08-25 02:52:37 · 154 阅读 · 0 评论 -
53.多态示例
main.cpp主函数的实现#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include "Hero.h"#include "Monster.h"#include "Weapon.h"#include "Knife.h"#include "DragonSword.h"#include <ctime&g...原创 2019-08-22 07:36:20 · 194 阅读 · 0 评论 -
52.析构和纯虚析构
虚析构和纯虚析构虚析构virtual ~类名() {}解决问题: 通过父类指针指向子类对象释放时候不干净导致的问题,虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象纯虚析构函数写法 virtual ~类名() = 0类内声明 类外实现如果出现了纯虚析构函数,这个类也算抽象类,不可以实例化对象main.cpp#define _CRT_SECUR...原创 2019-08-22 06:50:19 · 146 阅读 · 0 评论 -
51.多态实现计算器
多态案例 – 计算器案例早期方法 是不利于扩展开发有原则 开闭原则 -- 对扩展开放 对修改关闭利用多态实现 – 利于后期扩展,结构性非常好,可读性高, 效率稍微低,发生多态内部结构复杂抽象类 和 纯虚函数纯虚函数写法 virtual void func() = 0;抽象类型抽象类 不可以实例化对象如果类 继承了抽象类, 必须重写抽象类中的纯虚函数main.cpp...原创 2019-08-17 23:20:35 · 1198 阅读 · 0 评论 -
50.静态联编和动态联编,多态初识
静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。静态联编地址早绑定 编译阶段绑定好地址动态联编地址晚绑定 ,运行时候绑定好地址多态...原创 2019-08-17 22:33:48 · 243 阅读 · 0 评论 -
49.多继承
多继承概念我们可以从一个类继承,我们也可以能同时从多个类继承,这就是多继承。但是由于多继承是非常受争议的,从多个类继承可能会导致函数、变量等同名导致较多的歧义继承的概念以及问题class A : public B1, public B2,….引发二义性问题想解决二义性问题,就需要通过作用域来进行区分main.cpp// 40.继承方式.cpp : 定义控制台应用程序的入口点。//...原创 2019-08-16 02:35:47 · 116 阅读 · 0 评论