C++
文章平均质量分 89
万里归来少年心
这个作者很懒,什么都没留下…
展开
-
ReadDirectoryChangesW 监控文件变化
本文测试了ReadDirectoryChangesW类监控文件变化。#include<iostream> #include<string>#include<Windows.h>using namespace std;string WStringToString(const std::wstring &wstr);void R...原创 2020-01-15 18:00:40 · 1404 阅读 · 2 评论 -
c++实现简单的线程池
线程池,先创建一定数目的线程,初始都处于空闲状态。当有新的任务进来,从线程池中取出一个空闲的线程处理任务,处理完成之后,该线程被重新放回到线程池中。当线程池中的线程都在处理任务时,若有新的任务产生,只能等待,直到线程池中有线程结束任务空闲才能执行。 用c++实现固定线程数的线程池。#include <mutex>#include <condition_va...原创 2020-01-14 16:54:41 · 925 阅读 · 0 评论 -
物理CPU数、CPU核心数、CPU线程数
Windows系统中,在cmd中输入命令“wmic”。>wmicwmic:root\cli> 输入命令“cpu get Name”,获取物理CPU数。wmic:root\cli>cpu get NumberOfCoresNumberOfCores6 输入命令“cpu get NumberOfCores”,获取CPU核心数。wm...原创 2020-01-13 10:50:24 · 2040 阅读 · 0 评论 -
数据库批量插入数据
为了提高数据库的效率,采用批量插入的方式。1.InsertEntitybool DbWriter::InsertEntity(const std::vector<std::shared_ptr<IDbTable>>& entities){ if (entities.size() == 0) return true; ...原创 2020-01-07 15:14:20 · 741 阅读 · 0 评论 -
C++中Duration、Time_point和Clocks
C++11中的chrono库,实现时间相关的功能。1.duration duration表示一段时间间隔,原型是: template<class Rep, class Period = std::ratio<1>> class duration Rep是一个数值类型,表示时钟个数,Period表示每个时钟周期的秒数。Period的默...原创 2019-12-24 10:55:35 · 4158 阅读 · 1 评论 -
shared_ptr的内部实现原理
本文先分析shared_ptr的内部实现原理,然后实例演示shared_ptr的使用。1. 实现原理 shared_ptr的定义如下:template<class _Ty>class shared_ptr : public _Ptr_base<_Ty> shared_ptr从基类_Ptr_base 继承了如下成员变量(部分源码):...原创 2019-12-20 19:04:01 · 10351 阅读 · 2 评论 -
asio::io_context的事件循环
1. asio::io_context asio::io_context表示io的上下文,任何io都会涉及到一个io_context。 同步io会隐式地启动一个io_context, 而异步io需要我们指定一个io_context。 调用run()函数进入io事件循环。如果有io事件,事件完成会调用回调函数;如果没有io事件, io_context会自动取消事件循...原创 2019-12-19 15:50:21 · 5368 阅读 · 0 评论 -
基于Asio 的定时器( asio::steady_timer )
Asio是“异步 IO操作”。asio::steady_timer是定时器。1. io_context io_context对象为异步IO对象提供核心功能。每个 Asio 程序都至少有一个io_context对象。 run()是一个阻塞调用,所有的异步操作完成后,run()才返回。 下面程序空有io_context对象,却没有任何异步操作,所以run(...原创 2019-12-19 14:46:03 · 9700 阅读 · 2 评论 -
C++ vector 中 double 与 int8_t 转化
1. vector<double> 转化为 vector<int8_t>void EncodeDouble(const std::vector<double>& data, std::vector<int8_t>& result){ const double *dataPtr = data.data(); ui...原创 2019-12-12 16:30:03 · 3851 阅读 · 0 评论 -
C++ 模拟反射机制
本文用C++ 模拟反射机制。 声明一个类时,用类名注册一个打印函数。 打印函数的签名有规则:参数是string, 返回值是void ,函数名时Print+类名。#include <iostream>#include <map>#include <functional>#include <memory>#inc...原创 2019-12-11 09:29:29 · 383 阅读 · 0 评论 -
算法分析(二) - 归并排序 & 快速排序
归并排序、快速排序都是基于比较的排序算法。本文将详细分析这两种排序。 先说结论算法 基于比较 原地排序 稳定性 时间复杂度 最好 时间复杂度 最坏 时间复杂度 平均 归并排序 ✔ ✘ ✔ nlog(n) nlog(n) nlog(...原创 2019-12-04 14:32:10 · 235 阅读 · 0 评论 -
算法分析(一) - 冒泡排序 & 插入排序 & 选择排序
冒泡排序 、插入排序和选择排序都是基于比较的排序算法。本文将详细分析这三种排序。 先说结论:算法 基于比较 原地排序 稳定性 时间复杂度 最好 时间复杂度 最坏 时间复杂度 平均 冒泡排序 ✔ ✔ ✔ O(n) O() O() ...原创 2019-12-02 19:29:15 · 361 阅读 · 0 评论 -
STL 常用算法(四) - 算术 & 集合算法
概述STL常用算法主要分布在<algorithm>,<functional>和<numeric>中 <algorithm>定义了比较、交换、查找、遍历、复制、修改等操作。 <numeric>定义了简单数学运算的模板函数。 <functional>定义了模板类,用以声明函数对象。常用算法1.accumulate...原创 2019-11-23 12:43:42 · 219 阅读 · 0 评论 -
STL 常用算法(三) - 拷贝 & 替换算法
概述STL常用算法主要分布在<algorithm>,<functional>和<numeric>中 <algorithm>定义了比较、交换、查找、遍历、复制、修改等操作。 <numeric>定义了简单数学运算的模板函数。 <functional>定义了模板类,用以声明函数对象。常用算法1. copy...原创 2019-11-23 10:48:27 · 176 阅读 · 0 评论 -
STL 常用算法(二) - 排序算法
概述STL常用算法主要分布在<algorithm>,<functional>和<numeric>中 <algorithm>定义了比较、交换、查找、遍历、复制、修改等操作。 <numeric>定义了简单数学运算的模板函数。 <functional>定义了模板类,用以声明函数对象。常用算法1. sort ...原创 2019-11-23 10:22:58 · 243 阅读 · 0 评论 -
STL 常用算法(一) - 遍历 & 查找算法
概述STL常用算法主要分布在<algorithm>,<functional>和<numeric>中 <algorithm>定义了比较、交换、查找、遍历、复制、修改等操作。 <numeric>定义了简单数学运算的模板函数。 <functional>定义了模板类,用以声明函数对象。常用算法1. for_each...原创 2019-11-22 16:51:54 · 296 阅读 · 0 评论 -
C++中的谓词(一元谓词 & 二元谓词)
1.概念 返回bool类型的仿函数称为谓词 如果operator()接受一个参数,叫做一元谓词。 如果operator()接受两个参数,叫做二元谓词。2.一元谓词#include<iostream>#include<vector>#include<algorithm>using namespace std;cla...原创 2019-11-22 11:21:06 · 4384 阅读 · 0 评论 -
C++ 中的函数对象(仿函数)
概念:重载了函数调用操作符的类,其对象称为函数对象。 函数对象使用重载的()时,行为类似函数调用,也叫仿函数。本质:函数对象(仿函数)是一个类,不是函数。使用:函数对象在使用时,可以像普通函数那样调用,可以有参数和返回值。#include<iostream>using namespace std;class MyAdd{public: int o...原创 2019-11-22 10:22:24 · 296 阅读 · 0 评论 -
C++ 二进制文件的读写
1.写文件 二进制方式写文件,利用流对象的成员函数write。 函数原型: ostream & write(const char * buffer, int len); 参数含义:buffer指向内存中一段存储空间,len是写的字节数。#include<iostream>#include<fstream>#include<s...原创 2019-11-21 14:46:06 · 678 阅读 · 0 评论 -
C++ 读取文件的四种方式
本文介绍C++ 读取文件的四种方式。 第一种方式:#include<iostream>#include<fstream>using namespace std;int main(){ ifstream ifs; ifs.open("text.txt",ios::in); if (!ifs.is_open()) ...原创 2019-11-21 14:24:04 · 30107 阅读 · 0 评论 -
C++ 使用Swap收缩内存空间
C++中,Swap用于交换容器内容。#include<iostream>#include<vector>#include<algorithm>using namespace std;void print(int val){ cout << val << " ";}int main(){ v...原创 2019-11-21 12:01:47 · 805 阅读 · 2 评论 -
C++ 使用gRPC入门教程
gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言,能够基于语言自动生成客户端和服务端功能库。 1.新建工程GrpcClient、GrpcServer和GrpcLibrary 添加 - 新建项目 - 控制台应用 GrpcC...原创 2019-11-11 11:06:55 · 8657 阅读 · 3 评论 -
Visual Studio 输出目录&中间目录
当解决方案中有多个工程时,合理配置工程的“输出目录”及“中间目录”,能够方便代码的管理。 输出目录$(SolutionDir)bin/$(Platform)/$(Configuration) 中间目录$(SolutionDir)temp/$(Platform)/$(Configuration)/$(ProjectName) 执行结果 ...原创 2019-11-12 20:03:59 · 2019 阅读 · 0 评论 -
类图
1.UML图的种类 UML(Unified Model Language) 统一建模语言。 UML 是一种为面向对象开发系统的产品进行说明、可视化、和编制文档的标准语言; UML 作为一种模型语言,它使开发人员专注于建立产品的模型和结构,而不是选用什么程序语言和算法实现;(1)结构型图类图 对象图 构件图 部署图 包图(2)行为型图活动图 ...原创 2018-09-01 10:26:06 · 1564 阅读 · 0 评论 -
给代码建个好结构
本文以一个开源项目为例,介绍如何组织一个层次分明、易于检索的文件结构。 如下图是该项目的根目录: 1.README 大写字母命名,放在根目录中,回答“软件要用来干什么?”的问题。2.LICENSE 大写字母命名,放在根目录中,回答“软件可以拿来用吗?”的问题。3.src目录 src目录中存放源代码。其中可以进一步划分多个子目录,...原创 2019-07-31 09:18:49 · 167 阅读 · 0 评论 -
给代码写个好声明
声明用来定义类、方法、类变量、局部变量和常量等。 声明一般包含两个部分:标识符的名字和类型,如:int id; 好的声明包含以下几个原则:1.一行一个声明 一行一个声明(即使这一行很短),能方便的阅读、更新和维护代码。int id;int age;2.变量声明时初始化 除非变量的初始值涉及到一定的计算,否则,声明时就应该初始化...原创 2019-07-30 14:22:11 · 736 阅读 · 0 评论 -
给代码起个好名字
给代码起个好名字,有助于理顺代码逻辑,提高代码的清晰度,提高开发效率。 目前,比较常用的命名方法有:驼峰命名法 蛇形命名法 串式命名法 匈牙利命名法 本文主要介绍驼峰命名法。1.驼峰命名法 驼峰命名法分为“大驼峰命名法”和“小驼峰命名法”,它们用于表示不同的类型。 “大驼峰命名法”是每个单词首字母大写,其它字母小写,然后将所有的单词连在一...原创 2019-07-30 09:24:12 · 2720 阅读 · 0 评论 -
Visual Studio 设置增量编译
1、项目-属性-配置属性-C/C++-代码生成-启用最小重新生成:是(/Gm)2、项目-属性-配置属性-C/C++-常规-调试信息格式:程序数据库(/Zi)3、项目-属性-配置属性-链接器-常规-“启用增量链接”选择“是”4、工具-选项-项目和解决方案-生成并运行-当项目过期时,选择“提示生成”5、工具-选项-项目和解决方案-生成并运行-勾选-在运行时仅生成项目和依赖...原创 2019-07-04 16:35:11 · 4800 阅读 · 1 评论 -
constexpr 编译期可求值
constexpr的语义是“常量表达式”,也就是在编译期可求值的表达式。 constexpr所修饰的变量一定是编译期可求值的,常见为字面值、全局变量/函数的地址、sizeof等。 constexpr修饰函数,其所有参数都是constexpr。constexpr int Inc(int i) { return i + 1;}constexpr int a = I...原创 2019-07-04 10:08:59 · 368 阅读 · 0 评论 -
类对象占用的空间
1.类对象至少占用一个字节 类中既没有属性也没有函数是,它的对象大小为一个字节。class A {};int main(){ A a; cout << "size = " << sizeof(a)<<endl; //size = 1 return 0;}2. 普通成员函数和静态成员函数都不占用对象的空间。class A...原创 2019-05-04 18:46:44 · 447 阅读 · 0 评论 -
c++多线程(十九) - std::timed_mutex
mutex获取和释放锁如下:mutex myMutex;myMutex.lock();//业务代码myMutex.unlock(); 当mutex获取锁失败时,线程会一直阻塞。 timed_mutex带超时功能。在规定的等待时间内,没有获取锁,线程不会一直阻塞,代码会继续执行。timed_mutex myMutex;chrono::milliseco...原创 2019-05-04 11:35:07 · 5753 阅读 · 1 评论 -
该不该使用条件运算符?
该不该使用条件运算符?不同的人可能给出截然相反的答案。 c语言之父丹尼斯里奇属于支持者。在他的书《c程序设计语言》中大量使用了条件运算符,代码简短,整洁。 kotlin语言和Go语言的设计者属于反对者。他们认为条件运算符容易产生编码错误,也会产生了很多难以理解的复杂表达式。因此这两种语言都不支持条件运算符。 对于简单的条件运算符,如:return fla...原创 2019-07-28 10:30:54 · 304 阅读 · 0 评论 -
给代码写个好注释
注释能让代码阅读者更好的理解代码。本文介绍注释的常见类型和注意事项。1.注释的类型1.1 记录代码版权和授权 这类注释放在每一个源代码文件的开头,说明源代码的所有者,以及授权使用的许可方式。 该注释的特点:首行和尾行只使用星号; 中间行以缩进一个空格的星号开始; 文字和星号之间使用一个空格。/* * Copyright (c) 2019, Na...原创 2019-08-09 15:51:30 · 529 阅读 · 0 评论 -
C++中的lambdas表达式
c++11引入lambdas表达式,它可以作为参数或者局部对象。1.简单示例 下面是一个简单的示例:#include <iostream>int main(){ []{ std::cout <<"hello lambda" <<std::endl; }(); return 0;} 运行结果...原创 2019-08-24 10:01:52 · 185 阅读 · 0 评论 -
Variadic Templates(二) -实现 tuple
本文用两种方法模拟实现c++中的Tuple。 Tuple可以接收任意数量和类型的元素。测试代码如下:#include <iostream>#include <string>int main(){ tuple<int, float, std::string> t(10, 9.17, "April"); std::c...原创 2019-08-29 09:06:12 · 297 阅读 · 0 评论 -
Variadic Templates(一)- 可变参数模板
本文实现函数的可变参数模板(Variadic Templates)#include<iostream>using namespace std;void print() {}template<typename T, typename... Types>void print(const T& head, const Types&... ...原创 2019-08-31 08:35:03 · 321 阅读 · 0 评论 -
测试C++中基本类型的哈希值
本文测试c++中基本类型的哈希值。#include <iostream>#include <string>using namespace std;int main(){ cout << "hash value = " << hash<int>()(123) << endl; cout <<...原创 2019-09-01 12:00:08 · 990 阅读 · 0 评论 -
测试C++中tuple的大小
本文测试c++中tuple的大小。#include <iostream>#include <string>#include <tuple>using namespace std;int main(){ cout << "size = " << sizeof(tuple<char>) <<...原创 2019-09-01 12:52:55 · 1430 阅读 · 0 评论 -
测试C++中 memory primitives
内存的申请和释放总结如下:分配 释放 类别 可否重载 malloc() free() C函数 不可 new delete C++表达式 不可 ::operatror new() ::operator delete() C++函数 可以 allocator<T>::allocate()...原创 2019-09-01 15:21:45 · 220 阅读 · 0 评论 -
c++中计时程序
项目中需要测试函数的运行时间,加入计时程序。简化实现如下: clock()记录开始和结束时间,CLOCKS_PER_SEC表示时钟次数,定义如下:#define CLOCKS_PER_SEC ((clock_t)1000) 代码如下:#include <time.h> #include <stdio.h> int main...原创 2019-09-10 10:53:31 · 492 阅读 · 0 评论