C++杂记(2)

来源:互联网 发布:mac中如何切换输入法 编辑:程序博客网 时间:2024/06/05 10:54

一:explicit关键字

explicit构造函数必须显示调用,即string s1(10);不能是string s2=10;

二:const关键字

1、定义const常量
const int Max = 100;
2、便于进行类型检查
void f(const int i){} 对于传入的参数进行类型检查,不匹配的时候会做出提示。
3、可以保护被修饰的东西,增加程序的健壮性。
void f(const int i){
i = 10; //错误
}
4、类似于宏定义,可以方便的进行参数修改,不改则已,一鸣惊人。
5、为函数重载提供参考
class A{
void f(int i){}
void f(int i)const{}
}//上面为两个不同的函数。
6、可以节省空间,避免不必要的内存分配
const定义常量只是给出了对应的内存地址,#define则是给出立即数,故const定义的常量在程序运行过程中只有一份拷贝,#define定义的常量在内存中有若干个拷贝。
7、提高效率
编译期通常不为普通的const常量分配内存空间,而将其保存在符号表中,使之成为一个编译期间的常量,减少了存储与读内存的操作。
8、示例
(1)char * const p 指针不变
(2)const char* p 指针所指向的内容为常量。
(3)void func(const char* var)参数指针所指内容为常量不可变。
(4)将参数设置为引用,可以增加效率,同时防止被修改。
如:void func(const class&var) //引用参数在函数内不可改变。
void func(const TYPE&var)//引用参数在函数内为常量不可改变。
9、const修饰成员函数
(1)const修饰类的成员函数,则该成员函数不可以修改类中任何非const成员函数
(2)const修饰成员函数最重要的作用就是限制对于const成员对象的使用
(3)const修饰的成员函数只能调用const修饰的成员函数

三:inline关键字

(1)inline必须与函数体放在一起才能是函数成为内联,仅将inline放在函数声明前不起任何作用,即inline是一种用来实现的关键字。
(2)定义在类声明之中的函数自动成为内联函数。
(3)内联函数仅仅是省去了函数调用的开销,并以代码复制为代价。因此,如果函数体内的代码较长,或者函数体内部有循环,则不宜使用内联函数。
(4)assert不是函数,而是宏。

四:c/c++头文件中#ifdef/#define/#define用法

主要作用是防止头文件被重复引用
格式如下:

 #ifdef     _xxx_H_              //如果没有定义_xx_H_ #define  _xxx_H_             //则定义 ............. #endif                            //否则不用定义

五:杂记

(1)空函数不占字节
(2)未实例化的指针不占字节
(3)枚举类型占4个字节
(4)二进制表示浮点数有精度问题,0.0实际上是非常接近0的小数。
(5)编译器只要能够完成程序语言翻译成机器语言即可,所以任意的语言均可实现。
(6)在c语言中,实参和对应的实参各占用独立的存储单元

六:将csv格式图片数据转换为lmdb格式(转)

from PIL import Imageimport osimport numpy as npimport pandas as pdtrain=pd.read_csv('E:\\Kaggle\\DigitRecognition\\train.csv')trainData=train.values[:, 1:]trainLabels=train.values[:, 0]# 写入标签数据,并利用像素点填充的方法讲矩阵中的像素点采用RGB模式填入一张图片中,# R=G=B代表灰度图片file = open('E:\\Kaggle\\DigitRecognition\\label.txt', 'w')img=Image.new('RGB', (28, 28), 0x000000)img_array=img.load()for line in range(0, 42000):    num=0    for x in range(28):        for y in range(28):            #将RGB三个分量取相等就表示灰度图            img_array[y, x] = (255-trainData[line, num], 255-trainData[line, num], 255-trainData[line, num])            num = num + 1    img.save('E:\Kaggle\DigitRecognition\\trainImages\\'+str(line)+'.jpg')    file.write('E:\Kaggle\DigitRecognition\\trainImages\\'+str(line)+'.jpg' + ' ' +str(trainLabels[line])+'\n')file.close()

原理是先生成一个空的图片,然后将下载下来的csv格式数据中的每一张图片像素点依次填入到一张图像中,即得到需要的图片。

测试数据的提取代码:from PIL import Imageimport osimport numpy as npimport pandas as pdtest=pd.read_csv('E:\\Kaggle\\DigitRecognition\\test.csv')testData=test.values[:, :]img=Image.new('RGB',(28, 28), 0x000000)img_array=img.load()for line in range(0, 28000):    num = 0    for x in range(28):        for y in range(28):            img_array[y, x] = (255-testData[line, num], 255-testData[line, num], 255-testData[line, num])            num = num+1    img.save('E:\\Kaggle\\DigitRecognition\\testImage\\'+str(line)+'.jpg')
原创粉丝点击