
C-C++
不然秋月春风夜
不然秋月春风夜,争那闲思往事何。
展开
-
使用shared_ptr代替new来管理缓存区
在开发的过程中,经常需要使用到缓存区。当缓存区过大(一般栈的大小默认为1M,当申请的缓存区大小超过1M,就不能使用栈来开辟对象。或者需要调整栈的带线啊哦),又或者我们一开始不知道需要开辟多大的空间,只有当程序运行的时候,才能获知需要开辟的内存空间的大小(在栈中申请内存,必须在编译期就知道需要开辟的空间的大小)。这时,就必须使用new/malloc等从堆中申请内存空间。而堆内存的申请和释放必须是成对...原创 2019-08-19 18:22:54 · 770 阅读 · 0 评论 -
c++中的async
在c++11中为我们提供了一种十分简易又遍历的异步线程的方法,这种就是async。以下是async的一些使用方法。分为以下几步:如何启动异步线程,如何知道异步线程的状态,怎么得到异步线程的结果。async的头文件时future.#include "future"#include "thread"#include "iostream"#include "windows.h"using...原创 2018-12-31 13:38:34 · 1181 阅读 · 0 评论 -
c/c++操作mysql
c/c++操作mysql的方法很多,这次我们使用mysql的原生API来操作mysql,来实现性能优化。下面是mysql API的基本流程,这是c的接口,我们可以适当封装下,将其改变成c++的接口类。这个需要需要mysql提供的静态库,这个需要从官网上去下。或者在安装完成后mysql,在安装目录下找下,libmysql.dll,libmysql.lib,以及对应的include下的头文件。对应搜...原创 2018-12-23 12:30:08 · 2573 阅读 · 0 评论 -
c++容器优化(以emplace 代替insert)
首先,以两张事实来说话,图一是emplace方法,7892条数据,debug下是1.14403秒。图二是insert方法,7892条数据,debug下是2.17625秒。结果其实已经不言而喻了,推荐使用emplace方法。为什么emplace方法比insert快呢?首先,我们必须明确一个概念就是,容器中插入的元素永远都不是元素本身,而是元素的一份copy。emplace其实就是调用了拷贝构造函数...原创 2018-12-17 00:29:03 · 5208 阅读 · 1 评论 -
CString、char*、string之间的转化
CString、char*、string之间的转化1.string -> char*直接调用c_str()函数即可。 std::string str("hello"); char dst[128]={}; strcpy(dst,str.c_str());2 char* -> string因为string中的构造函数和重载了赋值运算符,所以我们可以借助其来进行...原创 2018-12-16 23:30:32 · 189 阅读 · 0 评论 -
.hpp文件与模板
开门见山就一句话,.hpp文件是c++中默认模板实现文件。大家都知道.cpp是c++的实现文件,那么要使用.hpp文件呢?这就要从模板的编译和链接说起。模板的编译过程会分成两部分。一般大家会将对应的模板的定义和实现写在同一个文件中,而有时为了便利,我们也会将模板的实现文件和定义文件分开编写,这时在使用模板的时候,我们就不能像往常一样,包含模板的定义文件(.h),这样会报链接失败的。这时的正确的做法...原创 2018-12-04 23:22:31 · 1253 阅读 · 1 评论 -
std::functional 和std::bind的简单应用
#include <iostream>#include <functional>using namespace std;using callback_t = void(int);void print(int a){ cout << "a = "<<a << endl;}class A{public: A();...原创 2018-11-11 23:45:48 · 239 阅读 · 0 评论 -
变参模板
变参模板的简单应用和拆包#include <iostream>using namespace std;int g_num = 0;template<typename T>void add(const T& a){ cout << "add =" << ++g_num << ";a =" &原创 2018-11-11 23:27:28 · 194 阅读 · 0 评论 -
constexpr 关键字
在c++中,我们经常会遇到这样的情况,我们在我们遇到一个常量表达式。我们正常使用时,却无法通过编译,即使加上了const修饰符。这时就需要使用constexpr表示一个该值是一个常量。#include <iostream>using namespace std;unsigned int constexpr GetNum(){ return 10;}unsigned i...原创 2018-11-11 22:48:57 · 307 阅读 · 0 评论 -
c++ mutable关键字
在c++中const成员函数是无法修改成员变量的值。在c++11中出现了mutable关键字,表示的变量的值是可修改的,易变的。即可以在const成员函数中修改该变量的值,而不会导致编译失败。#include <iostream>using namespace std;class A{public: A(int a):m_a(a) {} int add(int b) ...原创 2018-11-11 22:29:01 · 576 阅读 · 0 评论 -
使用c++标准库生成随机数
C++标准库中将随机数的产生分为了两个部分:随机引擎(engine) 和分布(distriution)。随机引擎:是随机数的源头,会随机产生无正负号值,他们被随机均匀的分布在一个预定义最小(min())和最大(max())值之间,需要一个种子。分布:将随机引擎产生的值转换为随机数,线性或者非线性的分布在其中。**注意: **引擎是有状态的,当两个一样的引擎,使用同一个种子,并且状态相同时,会...原创 2018-10-26 21:55:24 · 1415 阅读 · 0 评论 -
c++对于极值的支持
#include <limits>#include <iostream>using namespace std;int main(){ //极值 cout << "short 的最大值是:" << numeric_limits<short>::max() << endl; cout <&原创 2018-10-28 23:15:58 · 559 阅读 · 0 评论 -
使用c++标准库中mutex和condition制作线程安全同步队列
逻辑很容易理解,直接看代码吧#include &lt;list&gt;#include &lt;mutex&gt;#include &lt;condition_variable&gt;#include &lt;iostream&gt;#include &lt;chrono&gt;#include &lt;thr原创 2018-10-28 22:02:50 · 562 阅读 · 0 评论 -
C++中的lambda
c++11中引入了lambda,允许inline函数被定义用作一个参数,或者一个local对象。lambda的引入改变了C++标准库的用法,主要用作搭配STL算法和容器。[capture list] (parameter list) -> return type { function body }1.capture list: 捕获列表, [=],意味着外部作用域以by value...原创 2018-09-22 20:23:10 · 522 阅读 · 0 评论 -
c++类的内存布局简单分析
首先要分析c++类的内存布局,我们应该找到能够直观的看到编译器生成的类的内存分布情况,因为我使用的是VS进行开发的,所以使用VS自带的功能进行查看。步骤只有一步,就是在命令行中添加/d1 reportSingleClassLayoutA,这样就可以在代码编译时,看到类的内存分布情况。2.下面我们写一个简单的类,看以下它的内存分布#include "stdafx.h"#include ...原创 2019-01-13 16:12:03 · 564 阅读 · 0 评论 -
c++中的override和final
这两个关键字的含义很简单,override表示的是这个虚函数必须被重写,final表示的是这个类或者虚函数不能在被继承或者重写,简单的用法如下:override从图中,我们就可以看到override的作用了,一些虚函数我们是要重写父类的虚函数的,但是由于我们写错了,没有这个关键字的话,程序是不会报错的,但是到运行的时候才能发现。有了这个关键字,我们就可以在编译期发现问题。final从图中,...原创 2019-01-13 16:27:03 · 552 阅读 · 0 评论 -
生成和调试dump文件
dump文件是进程一般用于程序崩溃前,生成的内存镜像文件,通过dump文件和程序编译生成的pdb文件来定位分析无法各种疑难杂症,只要有dump就能复现出当时崩溃的现象。手动生成先看下手动生成dump文件,任务管理器点击下创建转储文件,就会把进程的信息写入到对应的dump文件中。其次,代码生成#include "stdafx.h"#include "windows.h"#include...原创 2019-01-13 18:35:00 · 514 阅读 · 0 评论 -
c++结构体初始化未生效
在c语言中,我们通常都是用memset来初始化一个结构体。但是在c++中,使用memset来初始化一个结构体,却经常得不到正常的结果。这是为什么呢?问题其实是出在了,结构体成员变量类型上了,因为使用了非ADT类型(大致就是c++一些特有的类型,如string,vector等等)。memset初始化的时候,是将一块固定大小的内存置空,而string,vector等的大小并不是固定的,而是会动态变化...原创 2019-05-28 09:47:19 · 1514 阅读 · 0 评论 -
使数据库输出结果按照拼音排序进行输出和输出指定范围的结果
https://blog.youkuaiyun.com/qq_27727251/article/details/82733067原创 2019-05-28 09:22:17 · 174 阅读 · 0 评论 -
SQL 查找某个字段重复
select 字段名, Count() From 表名 Group By 字段名 Having Count() >1COUNT(*) 函数返回在给定的选择中被选的行数。参考如下:http://www.cnblogs.com/fanguangdexiaoyuer/p/6268211.html...原创 2019-02-21 23:41:09 · 1767 阅读 · 0 评论 -
libevent的简单使用
libevent的使用方法1.首先调用event_init()函数或者event_base_new()创建一个event_base对象。一个event_base相当于一个reactor实例。2.创建具体的事件处理器。并设置他们所从属的reactor实例.evsignal_new(),和evtimer_new()等分别用于创建信号和定时器事件或其他事件。统一入口时event_new()3.调用...原创 2019-02-08 21:51:32 · 481 阅读 · 0 评论 -
c++正则表达式
1. 转义字符在讲c++正则的时候,首先要讲一下,这个转义字符,在c++中匹配正则的时候,正则是需要对其中的’'进行转义的。cout << regex_match("123", regex("\d+")) << endl; //结果为0,需要转义字符'\'cout << regex_match("123", regex("\\d+"))原创 2019-02-05 10:36:56 · 528 阅读 · 0 评论 -
openssl中的base64
base64是一种基于64个可打印字符来表示二进制数据的方法。核心的方法是38 = 64;该怎么理解这个3 * 8 = 6 *4 呢?一个字节占8位,以3个字节为一组,将其24位拆成4个字节,每个字节填充6位,之后在6位的前面补两个0,形成4个字节形式。当然如果原文不够3个字节怎么办呢?加入还剩一个数,则将该数继续原来的操作,会转换成2个字节,然后不够四个字节,就在剩余的两个字节用’='进行补全。...原创 2019-02-02 16:02:53 · 2344 阅读 · 1 评论 -
openssl中的md5认证
md5 英文名为:Message Digest Algorithm,即信息摘要算法。这是一种散列算法,散列函数是一种公开的数学函数。散列函数运算中的输入信息叫做报文,运算后的所得的结果叫做散列码或者消息摘要。md5是一种非常著名的散列算法,已经成为国际标准。md5散列算法对输入的任意长度消息产生128位(16字节)长度的散列值(或称消息摘要)。注意,这个散列值是一个十六进制的值,而经常见到的是将...原创 2019-02-02 14:01:19 · 850 阅读 · 0 评论 -
判断一串字符串中是否有汉字
汉字占两个字节,每个字节的ASCII码最高位均为1,由于char默认为带符号类型,所以汉字的ASCII码小于0,而英文数字等其他字符占一个字节,ASCII码最高位为0,值在0~127之间。所以只要有一个字节的小于0,就代表存在汉字。#include<iostream>#include <string>using namespace std;int main(){...原创 2019-01-26 23:17:52 · 1870 阅读 · 0 评论 -
c++使用格式化输出和输入来完成进制转换
在c++中有三个flag来表示输出输入流的整数进制,分别为:oct 八进制dec 十进制 ,默认hex 十六进制上面没有提供二进制,但是转换时,可以借助biteset进行转换成二进制。需要特别注意的一点时,进制一旦被修改,除非再次被修改回来,否则修改将会一直作用。#include <iostream>#include <bitset>using name...原创 2019-01-26 22:45:44 · 379 阅读 · 0 评论 -
c++反转算法reverse和reverse_copy
在c++中提供了reverse和reverse_copy来完成反转。void reverse(beg,end);beg 起始位置,end终止位置Iterator reverse_cpoy(beg,end,destBeg);beg 起始位置,end终止位置,destBeg 需要copy到的起始位置.返回第一个未被覆盖的元素位置二者的区别,reverse会改变本身的顺序,而reverse_co...原创 2019-01-26 22:23:50 · 640 阅读 · 0 评论 -
c++ 中的bitset
类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作位集,并将它与字符串和整数相互转换。#include <iostream>#include <bitset>using namespace std;int main(){ int num; cin >> num; std::bitset<16> bin...原创 2019-01-26 00:11:35 · 220 阅读 · 0 评论 -
根据系统宏判断是不是windows系统
在c/c++的开发中,经常需要根据操作系统的不一样来做应用一些非跨平台的API函数,这是就要根据一些宏来判断是不是对应的操作系统。这次提供一个常用的宏,_MSC_VER,这是windows编译器自己定义的一个宏,所以我们可以借用该宏来完成对windows系统的识别。#include &lt;iostream&gt;int main(){#ifdef _MSC_VER std::cou...原创 2019-01-13 21:40:24 · 2258 阅读 · 0 评论 -
使用JsonCpp解析和生成Json
一:什么是JSON?JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation),是一种key-value的表示方法,类似于{ “name”:“Kobe” }二:什么时候用JSON?因为JSON的明了,简单,易于解析。JSON常用来传输和存储对应的文本信息。三:什么是JsonCppJsonCpp是一个基于c++的免费开源库。下载地址:htt...原创 2018-10-03 10:08:01 · 1072 阅读 · 0 评论 -
记录VS配置JSONCPP
1.首先下载对应的JSONCPP 文件 https://sourceforge.net/projects/jsoncpp/2.解压,进入 jsoncpp-src-0.5.0\makefiles\vs71 中打开.sln文件,选择x86或者x64,选择debug或者release,生成对应的.lib库。这个必须与自己将要以什么方式使用是一样的。使用该库的环境是debug模式下的x86,生成该库时,...原创 2018-10-02 23:30:39 · 219 阅读 · 0 评论 -
查看当前程序执行的环境变量
linux : 终端执行export命令 windows:dos窗口执行set命令原创 2018-03-13 23:12:49 · 1922 阅读 · 0 评论 -
查看命令的返回值
很多情况下,我们需要通过返回值判断命令的成功与否,这时就需通过一下命令查看上条命令的返回值。windows 系统: echo %errorlevel%linux 系统: echo $?...原创 2018-02-16 11:02:15 · 2221 阅读 · 0 评论 -
stat 函数解析
stat 函数的简单使用stat 函数是用来获取文件的各种属性的一个linux下的常用API函数。 函数原型为int stat(const char* path,struct stat* buf); stat定义如下:struct stat { dev_t st_dev; //文件的设备编号 ino_t st_ino; //节点 mode_t st_m...原创 2018-02-11 23:24:31 · 2281 阅读 · 0 评论 -
模拟硬盘空间占满的情况
模拟硬盘空间占满的情况话不多说,windows 和 linux 都可以采用生成一个固定大小的文件来模拟对应的情况。具体见下:windows使用fsutil的命令,这个是windows的高级命令,用法很多,用处很大。下面是其简单的用法之一: 生成一个固定大小文件fsutil file createnew 文件路径 长度(单位字节) 一次并不一定可以将硬盘的内存占...原创 2018-02-11 21:01:12 · 1214 阅读 · 1 评论 -
POSIX标准下的线程池的简单实现
POSIX标准下的线程池的简单实现一 条件变量操作 函数名 功能 函数原型 pthread_cond_init 条件变量的初始化 int pthread_cond_init(pthread_cond_t*cv,const pthread_condattr_t *cattr); pthread_cond_wait 等待(阻塞)在条件变量上原创 2018-02-04 13:18:03 · 476 阅读 · 1 评论 -
守护进程
守护进程(deamon)是一种特殊的进程,类似于windows下的服务,是一种在后台运行的服务进程,独立于控制终端,一般由系统启动时,引导启动,随着系统的关闭而关闭,不会随着用户的登录或者注销的影响。守护进程的运行方式①独立运行的守护进程:独立运行的守护进程由 init 脚本负责管理,所有独立运行的守护进程的脚本在/etc/rc.d/init.d/目录下。 ②由 xinetd 管理的守护进程:可以原创 2017-12-23 18:04:52 · 169 阅读 · 0 评论 -
linux中的软硬链接
软连接:相当于windows下快捷方式,里面记录了文件的路径 创建软链接:ln 命令ln -s 文件名 快捷方式的名字软连接的用途:以最小的代价方便文件的管理 请注意:文件名中尽量使用绝对路径。目录也是可以进行软链接的。 硬链接:相当于引用一样,使用同一块地址,同时计数器+1 ,当删除文件时,如果文件的计数器不为零,则文件(硬盘中)并 未被真正的消除,只是断开了该文件和内存的连接,同时原创 2017-12-22 23:09:59 · 191 阅读 · 0 评论 -
chown 和 chgrp
chown (change owner):修改文件所有者或所属组用法: - 1.chown 新的所有者 文件名 - 2.chown 新的所有者:新的用户所属组 文件名chgrp(change group):修改文件所属组 - chgrp 新的组 文件名二者执行时,需要root权限。原创 2017-12-22 22:20:39 · 283 阅读 · 0 评论 -
cat > $file
作用:用来将两个EOF之间的文本重定向到file文件中 用途:常用来生成简单的配置文件信息例子:#!/bin/bashfile_user_conff=.cat>$file_user_conf/user.conf<<EOFuser=xiaoyanage=18color=redEOF然后chmod +x 该脚本名称。执行该脚本,则会在当前目录下生成一个user.conf的文件。文件记载内原创 2017-12-22 21:44:51 · 1324 阅读 · 0 评论