C++
文章平均质量分 65
C++学习记录
ThorKing01
这个作者很懒,什么都没留下…
展开
-
萃取和constexpr
最近重温了一下萃取发现其与constexpr有相似之处,记录如下。原创 2023-10-24 20:35:10 · 445 阅读 · 0 评论 -
完成端口IOCP
完成端口IOCP模型学习原创 2022-10-24 21:23:18 · 949 阅读 · 1 评论 -
GetLastError(包括Wininet)
GetLastError之Wininet原创 2022-05-09 08:07:03 · 740 阅读 · 0 评论 -
C++ function
C++中有几种可调用对象:函数,指针,lambda表达式,bind创建的对象以及重载了调用运算符的类。通过function类型可以将多个不同类型的对象,整合到一个类型中。Tips:基础的thread调用的时候,传入的是一个函数指针。同理可得,还可以传入一个用户定义的函数对象,传入一个类的内部函数,传入一个命名完成的lambda表达式或者传入一个未命名的lambda表达式。一、背景使用多种类型的可调用对象构建一个计算器1.普通函数int add(int a,int b){.原创 2021-10-24 05:30:00 · 15057 阅读 · 2 评论 -
MFC双缓冲绘图
双缓冲绘图的核心是将所有绘图操作的屏幕设备CDC pDC 用自定义的内存设备CDC MemDC来代替,然后通过在内存的位图CBitmap中作图,然后将作好的图复制到屏幕MemDC来显示,同时禁止背景刷新,从而消除闪烁。一、原因窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。因为窗体在刷新时会有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PA原创 2021-07-28 11:01:17 · 2521 阅读 · 0 评论 -
error C2248: “CObject::CObject”: 无法访问 private 成员(在“CObject”类中声明)
原因首先说明原因,这是由于对CObject对象进行直接拷贝导致的,在MFC中,大部分对象都是继承自CObject。然而,CObject对象没有实现拷贝构造函数和拷贝赋值运算符,如下图所示。如下例所示:CStatic m_static1;m_static1.Create(NULL,NULL,_T("文本"),WS_VISIBLE,CRect(0,0,100,100),this,IDC_M_STATIC1);vector<CStatic> v_static;v_s..原创 2021-07-14 17:02:19 · 3239 阅读 · 1 评论 -
手写智能指针
template<typename T>class shared_ptr_my{public: shared_ptr_my(T* p=nullptr); shared_ptr_my(shared_ptr_my&); shared_ptr_my& operator=(shared_ptr_my&); shared_ptr_my(shared_ptr_my&&) noexcept; shared_ptr_my.原创 2020-08-28 16:38:32 · 286 阅读 · 0 评论 -
C++运算符重载
一、++i和i++对于前置与后置版本使用同样的符号,运算对象的数量和类型也相同,为了解决这个问题,后置版本接受一个额外的(不被使用的)int类型形参。这个形参唯一的作用就是区分前置版本和后置版本。当我们使用后置运算符的时候,编译器会为这个形参提供一个值为0的实参。尽管藏语法上来说后置函数可以使用功能这个额外的形参,但是实际过程中通常不使用。template<class ...原创 2020-04-28 16:21:17 · 256 阅读 · 0 评论 -
C++中typename关键字的使用方法和注意事项
目录起因 typename的常见用法 typename的来源 一些关键概念 限定名和非限定名 依赖名和非依赖名 类作用域 引入typename的真实原因 一个例子 问题浮现 千呼万唤始出来 不同编译器对错误情况的处理 使用typename的规则 其它例子 再看常见用法 参考 写在结尾起因近日,看到这样一行代码:typedef ...转载 2020-04-18 16:22:31 · 762 阅读 · 0 评论 -
C++ explicit和implicit
一、类类型转换首先,明确什么是类类型转换,内置类型存在定义了几种自动转换的规则,同样地,类也有定义隐式的转换规则。若构造函数没有声明explicit且只接受一个实参,则它可以进行隐式的类类型转换。(如何将一种类类型转换为另一种类类型的转换规则)类的构造函数默认是implicit的,可以进行隐式类类型转换的,explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是...原创 2020-04-17 22:31:55 · 599 阅读 · 0 评论 -
C++的内存分布以及static的使用
详见:https://blog.csdn.net/chenyijun/article/details/81938287static的使用主要为两部分:不涉及类的static和涉及类的staticC/C++的内存分布1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间。2.堆区:程序员分配并释放的区域,像malloc(c),new(c++...原创 2020-04-10 18:08:39 · 1514 阅读 · 0 评论 -
C++分割字符串
利用C++中的strtok函数来将string使用指定字符串分割。strtok函数头文件:#include <cstring>函数原型:char * strtok (char *str, const char * delimiters);参数:str:待分割的字符串(c-string);delimiters:分割符字符串。该函数用来将字符串分割成一个个片段。参数s...原创 2020-03-30 12:26:05 · 10264 阅读 · 5 评论 -
C++sort函数
很多算法都会比较输入序列中的元素。默认情况下,这类算法使用元素类型的<或者==运算符来完成比较。标准库还为这些算法定义了额外的版本,允许我们提供自己定义的的操作来代替默认运算符。以sort函数为例,默认使用<来进行比较,元素按照从小到大排序。sort函数的第二个版本接受第三个参数,此参数是一个谓词。谓词谓词是一个可调用表达式,其返回结果是一个能用作条件的值。标...原创 2020-03-09 16:12:03 · 461 阅读 · 0 评论 -
C++erase()
偶然发现了当vecotr在erase最后一个iter之后,仍然可以++代表一个值,而不为空。vector<int> nums={3,2,3,4};int val=3;auto iter=nums.begin();while(*iter){ if(*iter==val) nums.erase(iter); else iter++...原创 2019-12-30 14:23:18 · 2657 阅读 · 0 评论 -
dynamic_cast(C++primer习题19.3)
首先经过自己手敲得打的答案是对,错,错#include <iostream>using namespace std;class A{public: A(){}; virtual ~A(){};};class B:public A{public: B(){}; virtual ~B(){};};class C:public B{...原创 2019-12-25 20:51:36 · 273 阅读 · 0 评论 -
OpenCV中Mat的type类型与int值的对应以及初始化问题
在OpenCV中,数据类型可以使用int值来代替。常量类型的命名规则为:CV_(位数)+(数据类型)+(通道数)。其与int值的对应关系为: C1 C2 C3 C4 CV_8U 0 8 16 24 CV_8S 1 9 17 25 CV_16U 2 10 18 26 CV_16...原创 2019-12-07 14:47:38 · 3816 阅读 · 0 评论 -
C++编译的Tensorflow进行显存限制
tensorflow进行模型时会将显存占满,导致不能与其他模型并行。在Python中的Tensorflow显存设置代码config=tf.ConfigProto();config.gpu_options.per_process_gpu_memory_fraction=0.5set_session(tf.Session(config=config))在C++中GPUOption...原创 2019-11-14 15:52:06 · 1429 阅读 · 1 评论 -
using指示与using声明(C++primer习题18.16)
namespace Excercise{ int ivar=0; double dvar=0; const int limit=1000;}int ivar=0;//位置1void manip(){//位置2 double dvar=3.1415926; cout<<dvar<<endl; cout&l...原创 2019-10-28 11:37:27 · 236 阅读 · 0 评论 -
C++模板特例化(C++primer习题16.63/64)
一、函数模板特例化注意:1.原模板的声明必须在任何使用模板实例之前。2.特例化的模板的声明也必须在原模板的作用域中。3.特例化的模板的函数参数类型必须与原模板中的对应的类型匹配。在这个例子中,调用原模板的T是int;模板特例化的T是const char *;但是在写模板参数的形参时,需要注意:原模板的形参是T类型的引用,则模板特例化也需要写成引用。template <...原创 2019-10-26 16:09:09 · 218 阅读 · 0 评论 -
继承构造函数
Quote.hclass Quote {public: Quote() = default; Quote(const std::string &book, double sales_price): bookNo(book),price(sales_price){} std::string isbn() const { return b...原创 2019-10-11 20:21:16 · 549 阅读 · 1 评论 -
Python与C++中SVD(奇异值分解)得到的右奇异值不同
目录一、现象与问题二、解决办法1.C++与Python中SVD的结果不同问题。2.特征值求解右奇异值(eig)与直接求解右奇异值(svd)结果不同i.发现有几列元素互为相反数ii.最后两列的位置互换iii.最好直接使用奇异值分解,而不是使用分步计算。其中会有很多误差。一、现象与问题在Python中,使用的是np.linalg.svd()来得到左右奇异值和特征值...原创 2019-07-27 14:40:30 · 2600 阅读 · 0 评论 -
C++中容器的swap以及对string进行swap迭代器失效的现象
写在前面:1、使用范围for遍历容器的每个元素,需要使用auto& it引用元素的同一块内存空间,不要使用auto it因为范围for的原型就是容器的迭代器遍历元素,将迭代器所指向的元素值然后拷贝给it,所以it又是栈上的一块内存空间了。建议使用引用类型,若不需要修改则写成const auto &it,需要修改写出auto &it。2、关于array的swap的两个数...原创 2019-07-26 10:30:20 · 1690 阅读 · 1 评论 -
Eigen使用记录
Core#include<Eigen/Core>,包含Matrix和Array类,基础的线性代数运算和数组操作。定义矩阵typedef Eigen::Matrix<float,2,2> Base; 定义一个两行两列的矩阵类型。后续要使用的话,可以使用 Base A,B,C;来实例化。也可以直接定义一个矩阵Eigen::Matrix<float,2,2&...原创 2019-07-29 14:06:52 · 758 阅读 · 0 评论 -
C++中Eigen与OpenCV矩阵的转换
Eigen与Opencv之间的转换,在包含Eigen库的基础上,#include<opencv2/core/eigen.hpp>需要注意的是Eigen的声明库一定要声明在cv的Eigen库的前面。否则会报错。将Eigen::Matrix转换为cv::Matcv::eigen2cv(matrix,mat);#include <Eigen/Dense>#in...原创 2019-07-29 11:08:49 · 2721 阅读 · 6 评论 -
C++编译安装Tensorflow
C++编译安装Tensorflow遇见了很多大坑。。。爬了两天爬出来了。1.下载bazel。默认安装的是bazel0.27.1。> echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list&g...原创 2019-07-04 18:46:42 · 1656 阅读 · 3 评论 -
C++中顶层const和底层const
顶层const表示指针本身是个常量,底层const表示指针所指的对象是一个常量。int i=0;int * const p1=&i; 不能改变p的值,p是一个指针,所以p是一个顶层constconst int * p2=&i; 表示不能改变指针所指i的值,所以是一个底层constconst的顶层和底层不只是限定于指针,进行推广后。顶层const可以表示任意......原创 2019-06-25 09:10:01 · 674 阅读 · 0 评论 -
C++中可变lambda表达式
对于C++中可变lambda表达式在《C++primer》中,可变lambda 默认情况下,对于一个值被拷贝的变量,lambda不会改变其值。如果我们希望能改变一个被捕获的变量的值,就必须在参数列表后加上关键字mutable。因此,可变lambda不能省略参数列表。void f3(){ size_t v1 = 42; // local variable // f c...原创 2019-08-08 14:30:21 · 599 阅读 · 0 评论 -
[libprotobuf FATAL external/protobuf_archive/src/google/protobuf/stubs/common.cc:79]
[libprotobuf FATAL external/protobuf_archive/src/google/protobuf/stubs/common.cc:79] This program was compiled against version 2.6.1 of the Protocal Buffer runtime library, which is not compatible wit...原创 2019-08-06 11:26:01 · 2010 阅读 · 0 评论 -
C++中局部变量和全局变量的存储位置和内存回收机制
局部变量,参数变量存放在栈中,当离开作用范围后,分配的内存在作用范围外会被系统自动回收。切记!不要使用局部变量的指针和引用!在函数结束后,局部变量被释放后,指针和引用可能在短时间内可以使用,也可能会立即失效。因为在指针和引用所指向和代表的内存一旦被重新分配就会导致该指针和引用会立即失去原本想要存储的值,出现严重的语义错误。要想确保返回的引用或者指针是正确的,不妨提问:引用所引...原创 2019-08-07 15:29:10 · 6863 阅读 · 0 评论 -
C++数字转换
利用C++中的strtok函数来将string使用指定字符串分割。strtok函数头文件:#include <cstring>函数原型:char * strtok (char *str, const char * delimiters);参数:str:待分割的字符串(c-string);delimiters:分割符字符串。该函数用来将字符串分割成一个个片段。参数s...原创 2019-08-19 10:38:25 · 1719 阅读 · 0 评论 -
C++IO流
文件输出流包含多种打开模式:ofstream::out,以写的方式打开,默认截断文件即将之前的文件内容都丢弃;app,每次写操作之前都定位到文件末尾;trunc,截断文件。其中fstream继承于iostream,文件流可以像之前的cin和cout一样使用IO运算符(>>和<<)来读写文件。其中<<为输出运算符,将运算符右侧对象写到左侧对象中...原创 2019-08-09 18:50:14 · 391 阅读 · 0 评论 -
C++构造函数
构造函数没有返回类型默认构造函数 :参数列表为空合成的默认构造函数:一些简单的类中没有显示地定义默认构造函数,编译器会为其隐式地生成默认构造函数,这个默认构造函数称为合成的默认构造函数。但是有些类不能依赖于合成的默认构造函数,必须自定义默认构造函数。原因有三:1.定义了其它的构造函数。2.合成的默认构造函数可能会执行错误的初始化操作。例如,当对象中含有数组或指针类型的时候,被合成的...原创 2019-08-12 18:12:14 · 1606 阅读 · 3 评论 -
C++拷贝控制
前摘构造函数没有返回类型默认构造函数 :参数列表为空合成的默认构造函数:一些简单的类中没有显示地定义默认构造函数,编译器会为其隐式地生成默认构造函数,这个默认构造函数称为合成的默认构造函数。但是有些类不能依赖于合成的默认构造函数,必须自定义默认构造函数。原因有三:1.定义了其它的构造函数。2.合成的默认构造函数可能会执行错误的初始化操作。例如,当对象中含有数组或指针类型的时候,被合...原创 2019-09-12 11:23:35 · 229 阅读 · 0 评论 -
C++读取文件夹下的所有图片(使用OpenCV)
主要函数void cv::glob(String pattern,std::vector<string>&result,bool recursive=false)分析String pattern:绝对路径下的照片pattern = "/home/Data/data/*.jpg":选择*.jpg这一类的图片std::vector< cv::String...原创 2019-06-19 16:47:08 · 13200 阅读 · 5 评论