C++
GoingJack
怕什么真理无穷,进一寸有一寸欢喜。
展开
-
【c++】mutex condition_variable 自定义信号量的应用和使用
//mutex condition_variable 自定义信号量的使用#include <iostream>#include <thread>#include <mutex>#include <windows.h>#include <condition_variable>#include <queue>using namespace std;//1. 信号量使用 一个线程打印A 一个线程打印Bnamespace原创 2021-04-16 23:12:49 · 254 阅读 · 0 评论 -
windows平台下关于 SysNative 目录 重定向问题
参考MSDN文档 关于文件重定向的问题1 先看下面代码#define SYSTEM32 "C:/Windows/System32/123.txt"#define SYSNATIVE "C:/Windows/SysNative/123.txt"int main(){ if (CopyFile("D:/123.txt", SYSTEM32, FALSE) == 0) { printf("%d\n", GetLastError()); printf("failed原创 2020-11-25 23:36:10 · 721 阅读 · 0 评论 -
【C++】对象优化
关于对象优化在我们开发的高效率的代码,有非常重要的作用。首先我们学习对象使用的过程中背后调用了那些方法现在我们有如下的测试类。#include <iostream>using namespace std;class Test{public: Test(int a = 5, int b = 5) :ma(a), mb(b) { cout << "...原创 2019-07-17 16:03:45 · 178 阅读 · 0 评论 -
【C++】泛型算法
泛型算法特点泛型算法 = template + 迭代器 + 函数对象特点一:泛型算法的参数接收的都是迭代器特点二:泛型算法的参数还可以接收函数对象(C函数指针)sort,find,find_if,binary_search,for_each绑定器 + 二元函数对象 =》 一元函数对象bind1st:把二元函数对象的operator()(a, b)的第一个形参绑定起来bind2nd...原创 2019-07-17 00:39:42 · 167 阅读 · 0 评论 -
【C++】迭代器
容器的迭代器分为四种const_iterator:常量的正向迭代器 只能读,而不能写。 iterator:普通的正向迭代器。 reverse_iterator:普通的反向迭代器。 const_reverse_iterator:常量的反向迭代器。使用案例#include<iostream>#include <vector>using names...原创 2019-07-17 00:35:13 · 102 阅读 · 0 评论 -
【C++】无序关联容器和有序关联容器
无序关联容器:链式哈希表 增删改O(1)无论是有序关联容器还是有序关联容器都是基于(set:集合 key map:映射表 [key : value])unordered_set 单重集合:所谓的单重集合就是集合中的所有的元素都是唯一的,不存在俩个重复的元素。unordered_multiset 多重集合:所谓的多重集合和单重集合的元素是相反的。允许集合...原创 2019-07-17 00:35:39 · 921 阅读 · 0 评论 -
【C++】标准容器-容器适配器
适配器:stack queue priority_queue1,适配器底层没有自己的数据结构,它是另外一个容器的封装,它的方法全部由底层依赖的容器进行实现。2,没有实现自己的迭代器。准容器 - 容器适配器 => 设计模式,就叫做适配器模式怎么理解这个适配器?template<typename T, typename Container=deque<T>&...原创 2019-07-17 00:35:52 · 122 阅读 · 0 评论 -
【C++】deque和list以及它们和vector的区别
deque:双端队列容器底层数据结构:动态开辟的二维数组,一维数组从2开始,以2倍的方式进行扩容,每次扩容后,原来第二维的数组,从新的第一维数组的下标oldsize/2开始存放,上下都预留相同的空行,方便支持deque的首尾元素添加deque<int> deq;增加:deq.push_back(20); 从末尾添加元素 O(1) deq.push_front(2...原创 2019-07-16 18:25:35 · 224 阅读 · 0 评论 -
关于mutable,explicit和volatile的解析
mutable修饰普通成员变量,在const常方法中能够修改mutable修饰的普通成员变量。using namespace std;class Test{public: void chageMa(int val) const { ma = val; cout << "ma" << ma << endl; }private:...原创 2019-07-16 17:54:22 · 183 阅读 · 0 评论 -
【C++】关于多态详细解释_抽象类解释
如何解释多态静态(编译时期)的多态: 函数重载:在同一作用域底下,函数名字相同相同,但是函数的参数不同的一组函数称之为一组重载函数。 模板(函数模板,类模板):使用template<typename T>形式的格式化类型,这样写完之后,增加代码的复用性。 在编译阶段就决定了用那个函数动态(运行时期)的多态: 在继承结构中,基类指针(引用)指...原创 2019-07-16 15:55:35 · 161 阅读 · 0 评论 -
【C++】何种情况下发生动态绑定何种情况下发生静态绑定
理论知识虚函数和动态绑定 问题:是不是虚函数的调用一定就是动态绑定? 肯定不是的!1,在类的构造函数当中,调用虚函数,也是静态绑定(构造函数中调用其它函数(虚),不会发生动态绑定的)。2,如果不是通过指针或者引用变量来调用虚函数,那就是静态绑定。实践using namespace std;class Base{public: Base(int data = 0) :ma(...原创 2019-07-16 15:36:56 · 271 阅读 · 0 评论 -
【C++】那些函数不能实现成虚函数
前提虚函数依赖1,虚函数能产生地址,存储在vftable当中2,对象必须存在(vfptr->vftable->虚函数地址)俩个不能实现为虚函数的函数1.构造函数a.virtual+构造函数 NO!b.构造函数中(调用的任何函数都是静态绑定的)调用虚函数,也不用发生静态绑定派生类对象构造过程2.static静态成员方法NO virtual +...原创 2019-07-16 15:32:40 · 277 阅读 · 0 评论 -
【C++】虚函数,静态绑定和动态绑定
理论知识覆盖:基类和派生类的方法,返回值、函数名以及参数列表都相同,而且基类的方法是虚函数,那么派生类的方法就自动处理成虚函数,它们之间成为覆盖关系一个类添加了虚函数,对这个类有什么影响?总结一:一个类里面定义了虚函数,那么编译阶段,编译器给这个类类型产生一个唯一的vftable虚函数表,虚函数表中主要存储的内容就是RTTI指针和虚函数的地址。当程序运行时,每一张虚函数表都会加...原创 2019-07-16 15:04:59 · 399 阅读 · 0 评论 -
【C++】继承结构中类的类型相互转化问题
理论知识1.把继承结构中 也说成从上(基类)到下 (派生类)的结构2.基类对象 -> 派生类对象派生类对象 -> 基类对象基类指针(引用) -> 派生类对象派生类指针(引用)->基类对象总结:在继承结构中进行上下类型转换,默认只支持从下到上的类型转换 OK实践using namespace s...原创 2019-07-16 14:37:11 · 430 阅读 · 0 评论 -
【C++】重载覆盖和隐藏
理论知识1,重载关系一组函数要重载必须要处于同一作用域当中,而且函数名字相同,参数列表不同。3,覆盖关系基类和派生类的方法,返回值、函数名以及参数列表都相同,而且基类的方法是虚函数,那么派生类的方法就自动处理成虚函数,它们之间成为覆盖关系2,隐藏关系在继承结构中,派生类的同名成员 把基类的同名成员给隐藏调用了。例子第一个#include<iostr...原创 2019-07-16 14:30:49 · 279 阅读 · 0 评论 -
【C++】关于删除器的使用——lambda表达式的应用_function
我们可以根据不同类型的指针,写不同的删除器传递给unique_ptr来实现最终可以正确的释放资源#include<iostream>#include<memory>using namespace std;template<typename T>class MyDelete{public: void operator()(T *ptr)cons...原创 2019-07-18 17:09:17 · 612 阅读 · 0 评论 -
【C++】强弱智能指针引起的线程安全问题
使用普通裸指针造成的问题#include <iostream>#include <memory>#include <thread>using namespace std;class A{public: A() { cout << "A()" << endl; } ~A() { cout << "~A()"...原创 2019-07-18 16:43:13 · 2142 阅读 · 0 评论 -
【C++】右值引用
初始的右值引用的概念于使用看下面代码int main(){ int a = 10; int &b = a; //左值:有内存、有名字 右值:没名字(临时量)、没内存 //int &&c = a; //1 const int &c = 20; //2 int &&d = 20; //String &e = ...原创 2019-07-17 16:35:50 · 228 阅读 · 0 评论 -
排序算法之计数排序
void CountSort(vector<int> &vec){ if (vec.size() <= 1) { return; } int len = vec.size(); int max = vec[0]; int min = vec[0]; for (int i = 0; i < len; ++i) { if (vec[i] &g...原创 2019-07-20 21:54:50 · 109 阅读 · 0 评论 -
排序算法之鸡尾酒排序
话不多说直接上代码:void CockTailSort(vector<int> &vec){ if (vec.size() <= 1) { return; } int len = vec.size(); bool flag = true; for (int i = 0; i < len && flag ; ++i) { ...原创 2019-07-20 22:26:29 · 124 阅读 · 0 评论 -
线程同步的几个问题
#include<iostream>#include<thread>#include<mutex>using namespace std;void handle1(int time){ std::this_thread::sleep_for(std::chrono::seconds(time)); cout << "hello t...原创 2019-09-19 10:00:46 · 166 阅读 · 0 评论 -
给定一个数组,给定一个target,给定结果数组的个数k,求这个数组的子数组个数为k且子数组所有元素和为target所有子数组
思路:求得这个数组的所有子集的情况,然后将子集数组的元素个数为k的子数组的所有元素求和,判断是否等于target如果等于打印子数组。代码:int target = 7;void printvector(vector<int> arr){ for (int val : arr) { cout << val << " "; ...原创 2019-08-29 13:45:29 · 1028 阅读 · 0 评论 -
Set 使用总结
#include<iostream>#include<algorithm>#include<set>#include<map>using namespace std;int p[10001];int t[10001];//set基本知识int set01(){ set<long long int> s; s.in...原创 2019-08-28 00:28:02 · 688 阅读 · 0 评论 -
快速排序的递归和非递归写法
递归:void QuickSort(vector<int> &vec,int low,int high){ int i = low; int j = high; int tmp = vec[low]; while (i < j) { while (i < j&&vec[j] >= tmp)--j; vec[i] ...原创 2019-08-16 15:35:55 · 609 阅读 · 0 评论 -
动态链接
参考书籍:《C专家编程》动态链接地目的:主要目的是:把程序于它们使用的特定的函数库版本中分离开来。取而代之的是,我们约定由系统提供一个接口,该接口保持稳定,不随时间和操作系统的后续版本发生变化。使用动态链接 的优点于不足优点:1,可执行文件的体积可以非常小,更加有效地利用磁盘空间(换句话说它能够节省磁盘空间和虚拟内存,因为函数库只有在被需要时才被映射到进程中。),链接阶段地时间会...原创 2019-08-15 22:10:22 · 133 阅读 · 0 评论 -
C++为什么要引入weak_ptr智能指针,为什么不直接用shared_ptr
关于这个问题的前提我们都知道,shared_ptr和weak_ptr都是带有引用计数的智能指针,它俩的主要区别就是:shared_ptr可以改变引用计数的值,但是weak_ptr只是资源的观察者不会对资源的引用计数进行加1的操作但是我们为什么要引入weak_ptr这个智能指针呢?现在我们看如下的例子中:#include<iostream>using ...原创 2019-08-15 00:08:23 · 1332 阅读 · 0 评论 -
已知Right 和 Left 求中间值 Mid注意点
一般来说我们直接写成Mid = (Right + Left)/2的形式,但是这个形式存在很多隐患问题。一般来说这样写比较安全Mid = Left + (Right - Left)/21,整数溢出的情况代码:int Right = INT_MAX - 1;int Left = INT_MAX - 2;int Mid = (Right + Left) /...原创 2019-08-19 13:26:50 · 739 阅读 · 0 评论 -
关于对数器的使用
有一个你想测试的方法a 实现一个绝对正确但是复杂度不好的方法b 实现一个随机样本产生器 实现比对的方法 把方法a和方法b比对很多次来验证方法a是否正确 如果有一个样本使得比对出错,打印样本分析是那个方法出错。 当样本很多时比对测试依然正确,可以确定方法a已经正确。下面这个例子就是对归并排序的对数器的使用的测试。void merge(vector<int> &...原创 2019-08-19 12:55:16 · 111 阅读 · 0 评论 -
win32-Hook技术简单了解
//以下代码定义了一个简单的进程鼠标移动事件钩子详细内容参考链接:https://www.bilibili.com/video/av57998681关于如何创建一个Win32窗口的知识可参考:https://blog.csdn.net/qq_42418668/article/details/88917947如何钩子的回调函数的返回值为1即代表消息不发送到操作系统为应用程序维护的消息...原创 2019-08-06 01:16:09 · 1159 阅读 · 0 评论 -
设计模式-装饰器模式
装饰器模式Decorator通过子类实现功能增强的问题:为了增强现有类的功能,通过实现字类的方式,重写接口,可以完成功能扩展,代码中有太多子类添加进来。如下实现三个装饰类分别装饰汽车。class Car{public: virtual void show() = 0;};class Bmw :public Car{public: void show() { ...原创 2019-08-05 17:51:08 · 109 阅读 · 0 评论 -
设计模式-代理模式
代理模式:为其他对象提供一种代理以控制对这个对象的访问。以下的例子就是写不同的类对不同对看电影的权限的控制。class VideoSite{public: virtual void freeMovie() { cout << "观看免费电影" << endl; } virtual void vipMovie() { cout <...原创 2019-08-05 14:17:17 · 156 阅读 · 0 评论 -
设计模式-工厂模式
简单工厂模式 SimpleFactory把对象的创建封装在一个接口接口函数里面,通过传入不同的标识,返回创建的对象客户不用自己负责new对象,不用了解对象创建的详细的过程。class Car{public: Car(string name) :_name(name) {} virtual void show() = 0;protected: string _name;...原创 2019-08-05 11:20:50 · 123 阅读 · 0 评论 -
设计模式-单例模式
前言:设计模式主要需要基于以下的面向对象设计原则:1,对接口编程而不是对实现编程。2,优先使用对象组合而不是继承。单例模式一个类不管创建了多少次对象,永远之只能得到该类型一个对象的实例此类型模式常用于,比如日志模块 数据库模块等单例模式又分为:饿汉式单例模式懒汉式单例模式饿汉式单例模式class Singleton{public: static ...原创 2019-08-05 11:02:28 · 124 阅读 · 0 评论 -
单例模式之懒汉式单例模式和饿汉式单例模式
所谓的单例模式就是我们在日常开发中,可能某些类的设计最好只产生一个对象,然后我们需要用到对象的方法的时候,直接使用这个唯一对象调用其方法就可,例如,数据访问类,生成日志类等最好设计位单例模式的类。饿汉式的单例模式代码:class Singleon{public: static Singleon *getInstance() { return &instanc...原创 2019-07-22 01:20:32 · 300 阅读 · 0 评论 -
使用stringstream类来进行类型之间转化——使用istringstream格式化获得不同类型的变量
头文件#include<sstream>int和string之间的相互转换int str2int(string s){ stringstream ss; int n; ss << s; ss >> n; return n;}string int2string(int n){ stringstream ss; string st...原创 2019-07-21 11:26:43 · 184 阅读 · 0 评论 -
【C++】派生类构造过程
基本理论1.派生类从基类可以继承来所有的成员(变量和方法),除过构造函数和析构函数。问题一:派生类怎么初始化从基类继承来的成员变量呢?解答:通过调用基类相应的构造函数来初始化。派生类的构造函数和析构函数,负责初始化和清理派生类部分。问题二:派生类从基类继承来的成员,的初始化和清理由谁来负责呢?解答:是由基类的构造和析构来负责的。》》》派生类对象构造和析...原创 2019-07-16 14:12:38 · 1237 阅读 · 0 评论 -
【C++】关于继承的本质和原理
关于C++的继承的理论基础继承的本质:代码的复用所有C++的类或者说是所有面向对象类与类之间的关系总结起来有俩种1,组合 a part of ... ... 一部分的关系2,继承 a kind of... ... 一种的关系关于继承方式和访问限定罗列如下继承方式 基类的访问限定 派生类的访问限定 (main)外部的访问限定 public ...原创 2019-07-16 14:02:34 · 1875 阅读 · 0 评论 -
C++-istreamstring-分割字符串string的一个类
头文件#include <sstream>使用方法-使用istringstream分割string默认以空格作为分隔符#include <iostream>#include <string>#include <sstream>using namespace std;int main(){ string str = "1...原创 2019-07-07 14:21:41 · 1437 阅读 · 0 评论 -
C++实现Vector动态数组
#include <iostream>#include <string>#include <ctime>/*构造函数:定义对象(分配内存,构造函数)构造函数完了,对象就产生了析构函数:对象内存释放之前 栈 堆delete .data析构函数完了 -对象销毁对象的册灰姑娘元变量占用外部资源的时候,需要重写下面俩个函数,防止对象的浅拷贝问...原创 2019-06-04 19:32:30 · 731 阅读 · 0 评论 -
关于-858993460这个数字
开发环境win10+vs2017测试代码#include <iostream>using namespace std;int main(){ int c; cout << c <<endl; return 0;}报错??!!这段代码,如果不对项目做任何设置的话是会默认报错的。因为使用了未初始化的局部变...原创 2019-06-15 14:37:26 · 12512 阅读 · 0 评论