C++
小咸鱼_
这个作者很懒,什么都没留下…
展开
-
一个比较通用的makefile
CXX = g++LIB = -L/data/protobuf/2.5.0_x64/lib/INC = -I/data/protobuf/2.5.0_x64/include/ -I./CXXFLAGS = -DSNACC_DEEP_COPY -DHAVE_VARIABLE_SIZED_AUTOMATIC_ARRAYS -Wno-deprecated -fPICTARGET=main...原创 2018-08-27 16:13:29 · 2868 阅读 · 0 评论 -
数组元素的访问方式—指针与下标
数组元素的访问方式—指针与下标《c和指针》中有一句话:下标绝对不会比指针更有效率,但指针有时会比下标更有效率!在解释这句话之前说上一句自己的想法:效率很重要,但是不能仅仅为了提高点效率而牺牲某些比较重要的优势,比如可读性,很显然,在数组访问时,使用下标的的访问方式比指针的可读性更强,而有时指针正是程序错误的根源!下面解释下这句话:下面的例子中将数组中的所有元素都转载 2017-05-25 21:15:13 · 3214 阅读 · 0 评论 -
一个奇怪的数组访问方式
定义一个数组如下:int array[] = { 1, 2, 3 };如果我们要访问第三个元素,很简单:array[2]即可。也可以这样:*(array+2)因为数组名是指针常量,所以是合法的。但是,如果这样呢?2[array] 结果是什么?答案是:数组的第三个元素,即:array[2]、*(array+2)和2[array]是同样的。原创 2017-05-25 20:34:18 · 380 阅读 · 0 评论 -
指针的*和++(--)同时出现的一些情形
int a[2] = { 1, 10 };int *p = &a[0];如果有下面的操作:*++p*p++++*p++*++p那么它的结果是怎样?如何理解?如果*和++均在左边,则是从右向左结合的:*++p : 先对指针p向前移动1,然后*取该处的值++*p :先取p所指的值,然后对该值+1++*++p :先对指针p向前移动1,取该处的值,然原创 2017-05-25 16:45:43 · 846 阅读 · 0 评论 -
关于关联 组合 聚合 依赖关系
转自:http://blog.csdn.net/maybehelios/article/details/2038685图片作了一些更改。类之间的关系1. 种类: Generalization(泛化),Dependency(依赖关系)、Association(关联关系)、Aggregation(聚合关系)、Composition(合成关系)。2. 其中Aggregati转载 2017-01-05 21:39:19 · 994 阅读 · 1 评论 -
c++公有继承、保护继承和私有继承
C++中的继承方式有: public、private、protected三种(它们直接影响到派生类的成员、及其对象对基类成员访问的规则)。 (1)public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。 (2原创 2016-12-19 20:45:46 · 2114 阅读 · 0 评论 -
关于const修饰
int *a = &b表示a是一个int型指针,指向b所在地方。加const修饰,const三种地方可放,分别有两种不同的意思:1. const int *a2. int const *a3. int * const a1、2两种意思相同,const都在*之前,表示指针a指向的内容(b)是不可改动的,但是a仍然可以指向其他地址。3中const在*之后,表示指针是不变原创 2016-12-22 19:09:19 · 626 阅读 · 0 评论 -
封装caffe-windows-cpu(支持模型有多个输出)
注意:该版本为CPU版本。用到的caffe-windows来自:https://github.com/happynear/caffe-windows先下载caffe-windows,解压;然后下载第三方库:https://pan.baidu.com/s/1eStyfrc 解压到caffe-windows-master,看起来是这样:caffe-windows-master\3rd原创 2016-12-21 19:49:23 · 4063 阅读 · 11 评论 -
封装caffe-windows-master为动态链接库
因为caffe-windows-master的代码比较多,看着很乱,所以想到把它封装成一个类来调用做图像分类,这里以GPU版本为例,记录一下自己封装成DLL和如何使用封装后的DLL的过程。1.打开解决方案首先,需要修改解决方案配置(默认是Release),我们新建一个叫ReleaseGPU,平台修改为x64(因为用到的其他DLL是64位,配置成win32会出错),如下:原创 2016-07-04 21:17:53 · 11028 阅读 · 11 评论 -
关于C++封装类为动态链接库
之前用caffe做图片分类,对caffe的代码进行了封装。为了让代码看起来尽可能简洁,对分类的类进行了封装,刚开始的封装是这样的:classification.h如下:#ifndef CLASSIFICATION_H_#define CLASSIFICATION_H_#ifdef MULTI_RECOGNITION_API_EXPORTS#define MULTI_RECOGNIT原创 2016-12-14 11:02:15 · 6882 阅读 · 1 评论 -
Windows下C获取文件夹下所有文件名
#include #include#define IMGNUM 20000 //图片所在文件夹中图片的最大数量char img_files[IMGNUM][1000];int getFiles(char *path){ int num_of_img = 0; long hFile = 0; struct _finddata_t fileinfo; char p[700] =原创 2016-11-15 22:06:48 · 5178 阅读 · 0 评论 -
关于strncpy这个函数
1.不考虑内存重叠的strncpy网上很多博客也写了这个函数,面试也常常会遇到,但是,我发现网上的很多代码都是有问题的,我们先看下大部分网上博客的实现:char *strncpy(char *dst, const char *src, size_t len){ assert(dst != NULL && src != NULL); char *res = dst; while (l原创 2017-05-27 10:07:51 · 30548 阅读 · 1 评论 -
动态内存分配
1.mallocvoid *malloc(size_t size)malloc的参数就是要分配的字节数,如果内存池中可用的内存满足这个条件,malloc就返回一个指向被分配的内存块起始位置指针。malloc分配的是一块连续的内存,如果内存池是空的,或者它的内存无法满足要求,malloc就返回一个NULL指针。因此,对malloc返回值就行NULL检查是必要的。2.cal原创 2017-05-31 10:00:35 · 366 阅读 · 0 评论 -
protobuf extend使用
首先,message定义如下:package TEST;message BaseMsg{ required uint32 seq = 1; required Msg msg= 2;}message Msg{ enum Type { Read= 10; Write= 11; } required Ty...原创 2018-08-27 15:52:03 · 14544 阅读 · 1 评论 -
Makefile的一个例子
.PHONY:all clean #伪目标文件CPPFLAG=-g -Werror -WallLDFLAG=-L -lsocketINCFLAG=-I /usr/include/lua# 将目录下.cpp文件编译成.o文件,当前目录下的.h文件不需要指定%.o:%.cpp g++ -c $(CPPFLAG) $< $(INCFLAG) -o $@ SUB_MODULES=.原创 2017-07-19 17:01:55 · 2120 阅读 · 0 评论 -
临时对象和局部对象以及函数返回值优化
我们先看一个代码:void swap(int &a, int &b){ int temp = a; a = b; b = temp;}大部分人称temp为临时对象,实际上,应该称为局部对象更合理,真正的临时对象是不可见的——不会出现在你的源代码中。只要你产生一个non-heap 对象而没有为它命名,便诞生了一个临时对象。匿名对象(临时对象)通常发生于两种情况:1.隐式类型原创 2017-06-09 17:05:13 · 2090 阅读 · 0 评论 -
++和--操作符
c/c++里有两个操作符++和-- ,它们分别有前置式和后置式:int a=0;++a; 前置式a++; 后置式这两个操作都是把a的值+1,但是有什么区别呢?我们在C++的操作符重载里讨论这个问题。重载函数是以其参数类型来区分彼此的,然后不论++或--操作符的前置式或后置式,都没有参数,为了填平这个语言学漏洞,只好让后置式有一个int自变量,并在它被调用时,编译原创 2017-06-08 20:16:59 · 1878 阅读 · 0 评论 -
STL中的traits技术
STL中有个函数advance,用来将某个迭代器移动某个给定距离:templatevoid advance(IterT& iter, DistT d){}另外,我们知道,STL中有5中类型的迭代器:input迭代器:只能向前移动,每次移动一步,并且只可读取其所指的东西;output迭代器:只能向前移动,每次移动一步,并且只能涂写其所指的东西;forward迭代器:只能向原创 2017-06-08 14:37:09 · 2108 阅读 · 0 评论 -
typename和class
在模版编程中,经常看到typename和class:templatevoid print2nd( T& c){ ...}templatevoid print2nd( T& c){ ...}上面这种情况,typename和class是完全一样的。那么,什么时候必须使用typename而不是class?templatevoid print2nd(const C&原创 2017-06-07 21:48:37 · 2620 阅读 · 0 评论 -
将文件间的编译依存关系降至最低
Effective C++条款31:将文件间的编译依存关系降至最低转自:http://www.cnblogs.com/jerry19880126/p/3551836.html在说这一条款之前,先要了解一下C/C++的编译知识,假设有三个类ComplexClass, SimpleClass1和SimpleClass2,采用头文件将类的声明与类的实现分开,这样共对应于6个文件,分别是C转载 2017-06-06 22:26:15 · 1319 阅读 · 1 评论 -
Copy-and-swap idiom详解和实现安全自我赋值
任何管理某资源的类比如智能指针需要遵循一个规则(The Rule of Three):如果你需要显式地声明一下三者中的一个:析构函数、拷贝构造函数或者是拷贝赋值操作符,那么你需要显式的声明所有这三者。拷贝构造函数和析构函数实现起来比较容易,但是拷贝赋值操作符要复杂许多。它是怎么实现的?我们需要避免那些误区?那么Copy-and-swap就是完美的解决方案。而且可转载 2017-06-06 17:34:33 · 671 阅读 · 0 评论 -
断言assert
断言就是声明某种东西应该为真。assert的原型如下:void assert(int expression)当它被执行时,就对表达式进行测试,如果为假,则向标准错误打印一条诊断信息并终止程序。如果为真则继续执行程序。断言使得调试程序变得容易,当程序调试完毕后,我们可以在编译时通过定义NDEBUG消除所有的断言。可以使用-DNDEBUG编译器命令行选项或者在源文件中头文件as原创 2017-05-31 21:53:29 · 1382 阅读 · 0 评论 -
给定一个集合,输出它的所有子集
题目:集合是由大字字母(A-Z)组成的,要求输出集合的所有子集,每个子集一行,不能使用递归。例如 “ABD”的子集:NULL(空集)、A、B、C、AB、AC、BC、ABC(共8个)这个题可以用位图的思想做。比如集合{A,B} 对应位向量v=000...00011(26维)那么A表示1,B表示2,[0,3]循环(3是B在字母表的位置2+1计算得):0 & v原创 2017-06-05 14:51:01 · 5464 阅读 · 1 评论 -
Windows下用VS2013加载caffemodel做图像分类
本文假设你已经安装CUDA,CUDA版本是7.5。1.编译caffe的Windows版本happynear的博客已经介绍了如何在windows下编译caffe,这里把我自己编译的过程记录下来,也算是做做笔记,方便以后查看。1.1下载caffe-windows-master下载地址:caffe-windows-master1.2下载第三方库下载地址:3rdpa原创 2016-11-25 21:18:56 · 18144 阅读 · 56 评论 -
C/C++根据图片URL下载图片
主要使用URLDownloadToFile函数函数的介绍:https://msdn.microsoft.com/en-us/library/ms775123(v=vs.85).aspx由于函数的参数使用的是LPWSTR,而代码里经常用到的是string,所以用到了string转LPWSTR:size_t len = line.length();//line为string类型int n原创 2016-11-16 17:14:15 · 6181 阅读 · 1 评论 -
不重新定义继承而来的缺省参数值
你只能继承两种函数;virtual函数和non-virtual函数。然而重新定义一个继承而来的non-virtual函数是不应该的,所以我们不考虑重新定义一个继承而来的non-virtual函数,只讨论“继承一个带有缺省参数值的virtual函数”。!!!问题引出自:virtual函数是动态绑定,而缺省参数值却是静态绑定。什么是动态绑定和叫静态绑定?对象的所谓静态类型,就是它在程序中被声明原创 2016-01-23 12:29:47 · 755 阅读 · 0 评论 -
当基类被继承后this指针将代表派生类的this指针
假如有一派生类Derived,初始化是需要调用基类Base的构造函数,基类的构造函数中的this将代表派生类的this,例如:基类:class Base{public: Base() { cout << "Base this =" << this << endl; } void fun() { cout << "fun this =" << this << endl;原创 2016-04-24 20:02:42 · 1694 阅读 · 0 评论 -
C++中的ostringstream、istringstream和getline()
首先,其头文件为:#include1.ostringstream向string中写入数据,当我们构造输出时,希望最后一起输出,使用ostringstream。如caffe源码Blob中有个函数:inline string shape_string() const { ostringstream stream; for (int i = 0; i < shap原创 2016-02-27 17:03:24 · 9384 阅读 · 0 评论 -
大数组一次性初始化
例如,数组:int x[10000]要求将其全部初始化为0,用循环的话太慢,用memset函数即可快速对数组清零。void *memset(void *s, int ch, size_t n);函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。所以,用0初始化x[10000]可以这样:memset(x,原创 2016-01-19 20:06:05 · 1708 阅读 · 0 评论 -
模板元编程实现递归
例如,用递归计算阶乘。templatestruct Factorial{ enum{ value=n*Factorial::value}; };template<>struct Factorial{ enum{value=1}; };这样,假如要计算4的阶乘,只要Factorial::value就能得到4的阶乘值。(来自Effective C++)原创 2016-01-26 17:35:40 · 953 阅读 · 0 评论 -
模板化基类内寻找继承而来的名称的问题
templateclass MsgSender{public: void sendClear(const MsgInfo& info) { ... } void sendSecret(const MsgInfo& info) { ... }};templateclass LoggingMsgSender:public MsgSender{public:原创 2016-01-24 22:32:57 · 622 阅读 · 0 评论 -
Derived class重新定义继承而来的Private Virtual函数
基类有一个公有函数,也有一个私有的虚函数,共有函数调用此私有虚函数,那么,当派生类继承基类时,派生类可重写此私有虚函数,然后当派生类对象调用healthValue()时,doHealthValue()将调用派生类重写的doHealthValue()。这种手法称为non-virtual interface(NVI)。这个non-virtual函数(healyhValue)称为virtual函数(do原创 2016-01-23 10:11:57 · 1083 阅读 · 0 评论 -
避免掩蔽继承而来的名称
此例内含一组混合了public和private名称,以及一组成员变量和成员函数名称。这些成员函数包括pure virtual,impure virtual和non-virtual三种。假设derived class内的mf4的实现代码是这样的:void Derived::mf4(){ ... mf(2) ...} 这里编译器看到这里使用名称mf2,必须估算它指原创 2016-01-22 16:23:53 · 909 阅读 · 0 评论 -
以引用的方式传递参数避免对象切割
当一个子类对象以传值的方式传递并被视为一个基类对象,基类的copy构造函数会被调用,而造成“此对象的行为像个子类对象”的那些性质被完全切割掉,仅留下一个基类对象。例如:class Window{public: std::string name() const; virtual void display() const;};class WindowWithScrollBars :原创 2016-01-20 15:47:46 · 1150 阅读 · 0 评论 -
赋值不是初始化
class PhoneNumber {...};class ABEntry{public: ABEntry(const std::string& name, const std::string& address, const std::aligned_storage& phones);private: std::string theName; std::string theAddress原创 2016-01-19 21:00:53 · 1012 阅读 · 0 评论 -
发布自己的工程库
什么是程序库?库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。比如你经常使用的STL(Standard Template Library)也是库,有了STL你才能方便地使用std::string、std::cout这些类。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存,被别的转载 2016-07-03 20:59:38 · 1340 阅读 · 0 评论 -
C/C++ 创建、删除目录
/***************************************************************\| *函数名 : _access| *原 型 : int __cdecl _access(const char *_Filename,int _AccessMode) | *功 能 : 判断某目录权限,若不存在或无此权限则返回-1,否则返回0| *原创 2016-07-26 16:10:42 · 2640 阅读 · 1 评论 -
Linux下C获取文件夹下所有文件名
参考http://www.cnblogs.com/xudong-bupt/p/3504442.html做了些修改。#include #include #include #include #include char img_path[500][1000];int img_num=0;int readFileList(char *basePath){ D原创 2016-11-11 11:19:41 · 12141 阅读 · 0 评论 -
不能声明为虚函数的函数
1.普通函数2.友元函数3.内联函数(编译期间展开,虚函数是在运行期间绑定)4.构造函数5.静态成员函数(只有一份大家共享)原创 2016-10-13 19:52:06 · 714 阅读 · 0 评论 -
顺时针打印矩阵
题目:顺时针打印矩阵想法是,先判断矩阵是否是只有一行或者一列,如果是,则直接打印即可;否则,就按下图方式打印一圈:打印完一圈之后,接着递归打印”内部“的矩阵。c++代码如下:class Solution {public: void print(vector > &matrix,vector &out,int left,int top,int right,i原创 2016-09-27 21:27:36 · 712 阅读 · 0 评论