C++_杂篇
文章平均质量分 88
Icoding_F2014
相信代码可以变化世界
展开
-
C++ map和hash_map的性能对比
map和hash_map都是C++里面提供的关联容器,它们都支持高性能的插入、删除、查找操作。map内部是基于红黑树来实现的,而hash_map是基于线性同余哈希+开链解决冲突 来实现的。注意,hash_map并未纳入C++标准之中,因此不同厂商的STL库的hash_map的接口、性能保障可能会有出入。在C++11中,hash_map被正式纳入到STL里面,但是换了个名字:unordered_...原创 2019-12-23 11:14:07 · 4135 阅读 · 0 评论 -
STL源码分析:map
STL里面map是基于一颗红黑树来实现的,map其实是对红黑树的接口做了一下封装。对于底层的红黑树来说,map底层的红黑树的实例化为: typedef rb_tree<key_type, value_type, select1st<value_type>, key_compare, Alloc> rep_type;而value...原创 2019-12-22 22:35:51 · 423 阅读 · 1 评论 -
是否任何情况下宏定义的max/min 都比函数定义的max/min 更快
很多时候,处于减少函数栈帧的申请开销,一些奇怪的建议会建议我们把max/min这种小函数定义为宏。通常情况下,这种优化策略是没得问题的,但是有时宏的简单替换不但没法减少开销,反而会大大增加开销的。这个例子是我从《编程珠玑》看来的。求一个数组中的最大值。方法一把max定义为函数#include <stdio.h>#include <stdlib.h>#incl...原创 2019-10-22 00:49:10 · 454 阅读 · 0 评论 -
VS2013解决 The C++ Standard Library forbids macroizing keywords.
解决: VS2013的错误: Error C1189: “The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro[…]”打开项目属性导航到 C/C++ 下的Preprocessor.选择 Preprocessor Definitions 项原创 2017-12-22 15:58:46 · 4052 阅读 · 1 评论 -
STL 源码分析之string(一)基础篇
STL源码下载:https://www.sgi.com/tech/stl/download.html其中string类需要在3.1以后的版本才有定义。源码分析:typedef basic_string<char> string;string类是由模板类basic_string_String_base类template <class _Tp, class _Alloc> class _Strin原创 2017-10-20 16:32:17 · 4192 阅读 · 0 评论 -
C/C++ return 如何实现的?return 的内部机制
本篇博客,我们来看看,在C/C++里面函数的return 关键字究竟做了什么工作,我们从return 基本的数据类型 像int/char/void */,到struct 再到带构造函数的类,一步步分析。return int/char,void* 以及他们的引用···#include <stdio.h>#include <stdlib.h>int bfunc(){ int rst = 0原创 2017-10-29 11:40:31 · 8700 阅读 · 4 评论 -
C++ 转型动作的新认识
之前学习C/C++的时候一直都认为类型转换(不管是显式的还是隐式的)其实什么都没有做,只是告诉编译器类型改变了一下,让它的翻译内存二进制数据的时候以新类型的套路去翻译而已。 然而当我看到Effective C++ rule 27.关于转型动作会触发其它动作时,我是很惊讶的。先贴出一段代码来看看,转型并不是什么都没有做,相反,它做了很多事情,我们一一来看。#include <stdio.h>#i原创 2017-10-12 11:06:17 · 413 阅读 · 0 评论 -
脑电波实时数据收集——RDA—数据包定义
brainproduct recorder 远程采集脑电波实时数据 文章描述了通过RDA模块进行EGG实时数据采集的基本方法以及RDA模块的网络协议所使用的数据报文格式和含义,本博文将RDA数据包所涉及的格式定义成相应的结构体。#pragma pack(1)#ifndef ULONGtypedef unsigned long ULONG;#endif//所有数据都是小段序struct RDA原创 2017-10-28 19:49:59 · 3720 阅读 · 8 评论 -
STL 源码分析之string(三)基础篇—insert,
STL源码下载:https://www.sgi.com/tech/stl/download.html vs工程代码:http://download.csdn.net/download/jmh1996/10032316其中string类需要在3.1以后的版本才有定义。 如果对basic_string和_String_base结构不熟悉的可以随时看上一篇博客: STL源码分析之string(一)原创 2017-10-28 10:40:18 · 691 阅读 · 0 评论 -
C++ 函数模板
什么是模板函数:通过函数模板生成的函数。 什么是函数模板:一组定义好的具有和函数类似的结构单元,这类结构单元将变量的类型视为变量,同时该结构定义了一组适用于多种类型的相同的算法逻辑。这类结构类似于函数,但是它们其实一些临时的结果,它们并不存在于最终的二进制文件中。 为什么要模板函数: 假设我们有一个函数:void swap(int & a,int &b){int temp=a;a=b;原创 2017-09-21 17:01:37 · 315 阅读 · 0 评论 -
C语言中特殊浮点数:-1.#IND00和NAN
前言在C语言的浮点数:float,double中存在一类特别的数:-1.#IND。我们有时会看到它。比如:float tmp =sqrt(-1);此时tmp的值就是-1.#INDIND其实就是Implementation Not define的意思,也就是说这个是未定义或者他不是一个数。 那么-1.#IND00是如何在内存中存储的呢?根据IEEE 745规定: 类别 正负号 实际指数原创 2017-09-20 15:36:39 · 12222 阅读 · 1 评论 -
双调排序
前言今天一次偶然的机会学习到了双调排序,还是感觉很有趣的,这种排序算法可以达到O(n(logn)(logn))的时间复杂度,更重要的是这种算法很好地支持了并发计算。 循环对S1,S2再使用相同的方法,直到S1与S2只有1元素,再重新整合起来即可。但是我们需要先使用某种方法先让数列成为一个双调序列。 具体的方法是:从小到大聚合: 显然当数列只有一个元素时,就已经是一个特殊的双调序原创 2017-09-19 13:34:41 · 1774 阅读 · 0 评论 -
STL 源码分析之string(二)基础篇—append,reserve,assign
STL源码下载:https://www.sgi.com/tech/stl/download.html vs工程代码:http://download.csdn.net/download/jmh1996/10032316其中string类需要在3.1以后的版本才有定义。 如果对basic_string和_String_base结构不熟悉的可以随时看上一篇博客: STL源码分析之string(一)原创 2017-10-26 21:50:46 · 2490 阅读 · 1 评论 -
VS2013 配置wincap开发环境
1.下载wincap安装包 下载驱动包: https://www.winpcap.org/install/bin/WinPcap_4_1_3.exe 安装驱动。下载开发包: https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip 将开发包解压至某ansic目录,例如:U:\libs目录下 D:\libs>dir 驱动器 D 中的卷没原创 2017-12-21 00:42:48 · 960 阅读 · 0 评论 -
(编译器文件“f:\dd\vctools\compiler\cxxfe\sl\p1\c\p0io.c”,第 2739 行) fatal error C1001: 编译器中发生内部错误。
VS2013,VS2015,VS2017——迷之错误:(编译器文件“f:\dd\vctools\compiler\cxxfe\sl\p1\c\p0io.c”,第 2739 行) fatal error C1001: 编译器中发生内部错误。一觉醒来,所有的VS都编译不了程序了????都报C1001错误?????而且是三个工具同时报错???真是令人郁闷之极啊~~~~解决思路:遇到这种代码明明没...原创 2019-06-11 10:45:53 · 3069 阅读 · 4 评论 -
freopen 标准输入输出的重定向
windows把标准输出重定向到文件:freopen(filename, "w", stdout);把filename改成相应的文件即可,这样重定向后所有的标准输出都会输出filename文件中。把标准输出重定向回控制台:freopen("CON", "w", stdout);...原创 2019-06-01 11:28:36 · 1116 阅读 · 0 评论 -
error C1083: cannot open include file: 'winsock2.h': No such file or directory
项目属性-> General ->设置平台-> v120_xp(Visual Studio 2013 -windows xp) ->重新编译。原创 2019-06-01 08:41:10 · 4275 阅读 · 0 评论 -
stl:: pair源码以及使用
前言本章 我们来介绍一下stl::pair模板.为什么要涉及这个东西嘞?这是因为在看LightGBM的时候经常看到pair出没。。。 其实pair就是一种二元关系,该关系定义了A,B两个集合的笛卡尔积 我们来看笛卡尔积的数学定义: 设存在集合A,B,我们定义集合A和B的乘积C.其中C=(a,b),s.t.a∈A,b∈BC=(a,b),s.t.a∈A,b∈BC={(a,b),s.t. a ...原创 2018-06-17 09:55:59 · 1137 阅读 · 1 评论 -
Lightgbm C++接口使用(一)
Lightgbm 是微软一款开源的随机森林学习库,该库 的牛逼之处就不用我们说明 啦。但是 目前网上关于Lightgbm的教程都是基于python或者R语言的,关于如何使用Lightgbm的C/C++接口却少有资料。刚好手上有个项目需要在线部署决策树模型,然而tensorflow C++版的样本不怎么好,因此我们想尝试看使用Lightgbm的C++版本能不能提供预测性能。然而官网并没有显式说...原创 2018-06-14 23:45:31 · 7179 阅读 · 6 评论 -
Wrapper Library & Library Wrapper
在计算机编程领域,软件库是一系列用于支持软件的库和函数的集合。软件库暴露出一些使用者可以方便调用的API来使相应的功能函数得到执行。Wrapper Library (或者也叫 library Wrapper)包含一个封装层,该封装层负责将现存的接口转换为更加灵活的接口。这么做的原因主要有: 1. 对原来的低级、复杂的设计进行优化 例如,有一坨祖传代码,但是祖传代码特别晦涩难用,于是写一个封装...原创 2018-05-07 10:05:39 · 846 阅读 · 0 评论 -
《编程珠玑》——读书笔记1
前言今天来读读《编程珠玑》,预计未来若干个月会有一系列博客记录《编程珠玑》的读书笔记。读书笔记第一章是本书的开篇,主要讲述了如何解决这么两个问题:一. 如何对实际问题进行抽象,找出问题的独特性质。 很多低级的程序员,一上来就使用普适性的方法来解决问题,而不去认真学习实际问题的性质。具体来说,实际问题的特性包括:输入数据的特征,内存的特征,运行时间的限制,问题本身的特征。 根...原创 2018-02-17 18:03:00 · 583 阅读 · 0 评论 -
Winpcap 开发教程
一、Winpcap开发包能干嘛?获取可用网卡的列表获取网卡的信息,包括数量,名字,地址嗅探抓包向网络发数据包将从网卡获取的网络流保存到磁盘对已经抓取的包进行使用高级语言进行过滤跨平台,在windows下用wInpcap开发的网络工具可以在Unix重新编译使用。二、Winpcap使用到的结构体三、使用方法3.1 创建pcap_t对象 函数有:pcap_t * pcap_open_原创 2017-12-22 11:53:29 · 2273 阅读 · 0 评论 -
Effective C++ rule 22.类成员变量尽量声明为private
前言Effective C++ 的rule 22在讨论类成员、函数的封装性,并给出了一些良性的忠告。什么是封装 Data hiding is one of the important features of Object Oriented Programming which allows preventing the functions of a program to access原创 2017-09-08 18:07:54 · 527 阅读 · 0 评论 -
STL源码分析之vector(三)—其它函数 eraser()、operator[]和operator =
说明: STL源码分析系列博客的使用的是https://www.sgi.com/tech/stl/download.html 里面的STL v2.03版.不同的STL或许会有所不同。 其它vector内容请参照本系列其它博客。 STL源码分析之vector(一) 基本数据类型及构造函数STL源码分析之vector(二)—核心函数 push_back及insert_aux STL源码分析之vecto原创 2017-09-14 10:59:17 · 1768 阅读 · 0 评论 -
Effective C++,rule 2,Prefer const,enum and inlines to #define
前言rule2主要讲的是#define相关的一些东西,由标题可知,这里说的是#define的在某些方面的不足以及一些可行的建议。另外,本节一个重要的内容就是enum hack技术。enum hack 既有 const int(char) “变量”的特性(可被访问控制),又有#define的特征(无法取其地址,从很大程度上杜绝不妄图非法修改常量的行为)#define 常量与const 常量的对比先看原创 2017-04-27 01:07:09 · 631 阅读 · 0 评论 -
MySQL 中mysql_query()来判断数据库是否连接中断(二)
前言上一节讲到,使用mysql_query()的返回值来判断数据库连接是否出错。但是,在实现的过程中发现无论是sql 语句本身有问题,比如 查询一张不存在的表,还是数据库的确shutdown了,mysql_query的返回值都是1.当mysql_query无错执行时,其值都为0.这就有一疑问了,为什么官方文档明明是那么写?可是实际中却?Excuse Me???再看官方文档:Return Value原创 2017-04-23 01:09:13 · 3449 阅读 · 1 评论 -
Effective C++,rule 1,View C++ as a federation of languages
前言怀着敬畏、怀疑、求知的心态,重读Effective C++这本经典书籍,接下来会有一系列博客来记录重读经典过程中的笔记、体会,记录其中的验证求实过程。当然学习一门语言最重要的就是质疑,尤其是阅读经典书籍中,在自己的现在的知识体系的基础上,对书中任何有怀疑的地方都一定要动手验证,多想为什么。正题C++的四个子成分:1. C语言部分。 这个部分是说,C++是以C为基础,所有C的语法、编原创 2017-04-26 08:37:27 · 369 阅读 · 0 评论 -
C++ 在类里面使用多线程技术
前言有很多时候,我们希望可以在C++类里面对那些比较耗时的函数使用多线程技术,但是熟悉C++对象语法的人应该知道,C++类的成员函数的函数指针不能直接做为参数传到pthread_create,主要因为是C++成员函数指针带有类命名空间,同时成员函数末尾是会被C++编译器加上可以接收对象地址的this指针参数。因此需要将成员函数做一定的转化,将其转化为不被编译器加上this指针,而由我们自己来为该函数原创 2017-05-16 07:24:13 · 14480 阅读 · 3 评论 -
MySQL 中mysql_query()来判断数据库是否连接中断
前言最近的项目在使用mysql C API进行数据库操作时,写了一个简易的连接池,因为mysql查询和插入频繁,但是单次查询与插入的时间开销小,每次进行数据库连接时的开销大。于是进程启动时建立了若干个长连接加入到连接池中,不同的查询和插入复用这些长连接即可。但是随之会有一个问题,当进程运行了相当长一段时间后,mysql对象中可能与mysql服务器断开连接,这需要做处理。原创 2017-04-21 15:29:37 · 4448 阅读 · 0 评论 -
OpenSSL中RSA的简易加解密流程
RSA是公钥密码体制的典范,在本实验中,我们的将使用OpenSSL自带的RSA相关函数生成RSA加密体系。下面是可能要使用到的一些函数说明。 (1)RSA *RSA_generate_key(int bits, unsigned long e_value,原创 2016-06-16 15:17:49 · 6600 阅读 · 0 评论 -
Effective C++,Rule 3,使用const
前言const允许用户定义一个语义上的约束。”语义”上是指约束只作用在源代码层上,而不能在汇编这一层发挥作用。”约束”是指一种限制要求,这要求const修饰的对象不应该被修改。在实际的开发中,应该保证所有那些在逻辑上具有”不改被修改”的对象都应该使用const来修饰之。至于这么做的好处,更多的是在源代码层这一层保证进程空间内数据的完整性,在很大程度上避免对关键数据的不恰当修改而导致的出乎意料的错误。原创 2017-04-30 08:37:23 · 560 阅读 · 0 评论 -
C/C++ const 修饰指针变量
前言在C/C++中,我们经常会用const来修改指针变量,而我们常常会在使用const中产生一些认识上的混乱,本文意在简单介绍const在修改指针变量时的不同性质。const关键字说明const修饰指针变量时的位置及含义:const在修饰指针变量时共有三种位置情况,以字符指针为例。 1. const char * p 2. char const *p 3. char * const p 其原创 2017-04-20 21:58:03 · 1526 阅读 · 1 评论 -
Shellcode中处理数据中\x00的方法
1、如果是字符串结束符,则使用: xor reg,regy push reg;类似的方法 2、如果00出现在一个字节、字、双字的内部: 1、出现在开头: 例如 shellcode 有一个语句:jmp 0x004015FE;如果直接写成二进制机器码就是 B8 FE154000;显然这样不可取; 一种解决方法:原创 2016-09-21 00:53:21 · 1588 阅读 · 0 评论 -
C语言宏定义用法总结
前言最近在看源代码与开发项目的时候经常会遇到一些特殊的宏用户,接接触时感觉有点奇怪,其实是自己没有全面的熟悉宏的用法。在查阅完相关的材料后,写下这一篇总结,以期待以后忘记的时候可以重新打开回忆起里面的内容来。本博文主要是总结#define的用法,包括定义符号与定义宏macro。预处理器的作用编译一个C语言程序的第一步骤就是预处理阶段,这一阶段就是宏发挥作用的阶段。C预处理器在源代码编译之前对其进行一原创 2017-06-01 16:42:22 · 17518 阅读 · 2 评论 -
printf格式化输出%x时的分析
使用printf(“%x”,…);可以输出指定参数的16进制形式,但是在实际的使用中,参数不一定都是32位的整数,有可能是16位的short,8位的char。如果使用printf %x 输出short和char会是什么结果呢? 为此,在VS2015编写简单代码如下:#include <stdio.h>#include <stdlib.h>int main(){ int l;原创 2016-12-26 10:44:51 · 41872 阅读 · 6 评论 -
Effective C++ rule12 复制对象时勿忘其每一个成分
前言有的时候,我们通常会自己给类定制复制函数,包括复制构造函数以及赋值运算符,但是复制函数并不是我们想象的那么好维护,本文主要着重于编写复制函数时“勿忘其每一个充分”这一个我们误以为做到了但通常上并没做到的点。举个例子dont talk ,show me your code code 1.1#include <stdio.h>#include <string>using namespace s原创 2017-08-02 10:51:37 · 388 阅读 · 0 评论 -
STL源码分析之deque,双端队列(一)
前言deque 双端队列,支持从两头push和pop数据,比一般的队列功能更加强大。也是一个常用的数据结构。本系列博客将来分析deque的实现源码。这个deque比之前看的vector复杂了一些。基础函数inline size_t __deque_buf_size(size_t n, size_t sz){ return n != 0 ? n : (sz < 512 ? size_t(512原创 2017-09-23 20:04:32 · 1040 阅读 · 0 评论 -
STL源码分析之vector(一) 基本数据类型及构造函数
说明: STL源码分析系列博客的使用的是https://www.sgi.com/tech/stl/download.html 里面的STL v2.03版.不同的STL或许会有所不同。工程文件可下载。前言C++ STL的vector 源码分析!主要介绍基本数据类型和构造函数!0. 主要成员变量及数据类型:template <class T, class Alloc = alloc>//模板参原创 2017-09-13 16:38:08 · 948 阅读 · 0 评论 -
C++ new和delete的原理分析
前言Effective C++ rule 16规则,让我重新认识了delete与new在处理数组时候的方式。new 有两种形式的new,一种是生成一个对象的operator New,另一个是用于数组的operator new []。同时 operator delete也分普通版本的operator delete 以及数组版的operator delete[].先说结论系列1.Operator new原创 2017-08-28 13:55:33 · 8272 阅读 · 0 评论 -
Effective C++ rule 21.尽量不要返回reference.
Effective C++ rule 21.不要返回reference.前言Rule 21.说的主要是指 如果函数必须返回一个对象,那么最好不要去返回一个引用。可能有些人会出于效率的考虑而返回对象的引用,但是返回引用虽然效率高了一点点却带来了另外的几个大麻烦:如果该对象是个局部对象,那么函数结束时,对象已经被释放,reference引用将会出错。如果该对象是个堆搞出来的动态对象,虽然函数结束时对原创 2017-09-06 07:27:12 · 447 阅读 · 0 评论