C/C++
_萤火
这个作者很懒,什么都没留下…
展开
-
Makefile的基本用法
target是目标文件- 也可以是标签,或者伪目标prerequisites是该文件所依赖的文件command是任意shell命令target: prerequisites command1 command2 ....伪目标用来执行除了构造外的其余命令,例如清除中间文件必须通过make [target] 来执行例如:make clean, make...原创 2019-06-28 19:18:10 · 841 阅读 · 1 评论 -
《essential c++》和 《accelaerated c++》阅读笔记
容器所有容器的公共操作== 和 !=empty()size()clear()begin() 和 end()insert()erase()因为 delete 为关键字不能用,所以改用 erase顺序容器一般指 vector,list或deque随机访问,尾端插入,不删除选 vector任意位置插入删除,顺序访问选 list前端插入或删除,随机访问选 ...原创 2018-12-21 08:22:01 · 209 阅读 · 0 评论 -
C++泛型算法库中的常用算法
find算法find(begin, end, val)find_if(begin, end, func)一般用来搜索无序容器,**binary_search()**搜索有序容器find() 返回首次出现的元素所在位置的迭代器,如果没找到返回 end()如果想要寻找的不是一个具体的值,而是满足某一规则的值,则应该选择find_if算法find_end搜索最后一次出现的地点//避...原创 2018-12-26 14:27:28 · 385 阅读 · 0 评论 -
extern关键字的用处
声明同一个文件中在引用位置后面定义的全局变量或函数声明同一个project中的别的 .c 文件中的全局变量和函数如果不想被引用的变量被修改,可以用 extern const 关键字头文件只能声明函数和变量,定义只能在某个.c 文件中因为头文件相当于直接在include的.c 文件中展开,如果在头文件中定义了变量或者函数,则当这个头文件被include多次时,会造成重复定义声明在头文件中原创 2018-01-20 12:28:28 · 647 阅读 · 0 评论 -
C++类构造函数为什么要使用初始化列表?
class Class {int a;double b;string s;void execute();};\\第一种写法Class::Class(){ a = 0; b = 1.0; s = "stirng";}\\第二种写法Class::Class():a(0), b(1.0), s("string"){ }上面的第一种初始化方法是我以前习惯的写法...原创 2018-11-17 15:03:47 · 696 阅读 · 0 评论 -
左值,右值和引用
左值与右值左值是长久存在的值, 如 arr, arr[x], *pt右值是临时存在的值, 如 x+y, “foo", 2最简单的判断方式就是能否用取地址符&操作无法对右值进行更改操作,也无法对右值赋值引用左值引用声明时在变量的类型后放置一个&来进行。如string& rstr= str;注意不能将一个右值赋值给左值引用, 如st原创 2018-11-17 17:42:55 · 101 阅读 · 0 评论 -
C++ 对象移动
右值和右值引用左值持久,右值短暂凡是有名字的都是左值,变量都是左值类型为右值引用的变量本身是个左值(下面有例子)返回值的函数返回的都是右值右值不能被绑定到左值引用,左值也不能被绑定到右值引用std::move为了避免命名冲突,前面的std一般不省略本身并不移动对象,只是将对象的类型转换为右值调用此函数即保证后面不会再使用传入的对象参数stack& ope...原创 2018-12-03 10:57:04 · 1756 阅读 · 0 评论 -
关于有序STL容器中修改元素的小坑
今天在实现最小生成树的时候,有一段代码是把一个容器中距离起点最小的节点拿出来,然后修改该节点任然存在于容器中的相邻节点到起点的距离,一直循环直到该容器中没有节点为止。我是自定义了节点的比较运算符,然后使用set存放,每次取出set中的第一个节点。然而测试的时候却发现每次取出来的并不是距离最小的节点,我换用了优先队列作为容器发现问题依然存在。经过思考才发现问题所在,原来set和优先队列都是使用树结...原创 2018-12-07 16:56:56 · 398 阅读 · 0 评论 -
关于在main.cpp文件中包含另一个.cpp文件的错误及原因
转自: https://blog.csdn.net/candcplusplus/article/details/7036917今天打开自己以前写代码突然觉得在man函数中如果要用的很多自己实现的函数,如果把它们都放在main.cpp文件中太臃肿了。调试起来特别不方便。能不能把这些自己实现的函数放到另外一个文件中呢?可是又不能把这些函数放在.h文件中。因为书上说.h文件中做好只放结构体、类等的申...转载 2018-12-06 21:20:49 · 1258 阅读 · 0 评论 -
typedef解析
定义typedef申明了一个已经定义好的变量的别名所谓已经定义好的变量可以是内置的变量(如 int, string等),也可以是自定义的变量(如自己申明的一个类的名字)一般介绍typedef时会用 type int A 的形式,这看上去和 #define A int 的语法形式差不多,然而两者是截然不同的前者是可以视为一个新的类型,是一个整体,而后者只是简单的文本替换ty...原创 2018-12-21 10:20:18 · 1342 阅读 · 0 评论 -
shared_ptr循环引用而产生内存泄漏
转自 :https://blog.csdn.net/u013040821/article/details/80517552循环引用为什么会导致内存泄漏?自智能指针的原理说起,一个智能指针在创建一个对象的时候初始化引用计数为 1,并把自己的指针指向创建的对象。但这个引用计数在何处?在智能指针内部?非也,这个计数是一个单独的对象来实现的,如图1,当另外一个智能指针指向这个对象的时候,便找到与这个对...转载 2018-12-24 22:18:16 · 1004 阅读 · 0 评论 -
operator++()和operator++(int)的区别
转自: https://blog.csdn.net/piaopiaohu123/article/details/7333771class UPInt {public: UPInt& operator++(); // ++ 前缀 const UPInt operator++(int); // ++ 后缀 UPInt& operator- -(); // – 前缀 cons...转载 2018-11-08 21:15:48 · 4912 阅读 · 0 评论 -
int()是什么?
今天读代码读到这么一条代码datum = std::vector<int>(size, int());一开始我是看不懂的,为什么int后面要加括号?结果上网查阅,才明白原来int()的意思是调用了int的默认构造函数,所以返回值应该是0. 这个可以类比一个类,类名 +()就是调用这个类的默认构造函数。...原创 2018-11-08 19:36:37 · 5915 阅读 · 1 评论 -
不同数据类型数据的比较大小
以前一直以为C语言中不允许不同数据类型数据的比较大小,今天尝试了一下发现是可以的。在比较的时候,编译器会先将比较符号两端的数据转化为同一类型,而转化的方式是向数据范围大的转化,比如char和int比较时,char转化为int,而int与float比较时,int转化为float。原创 2017-09-27 12:46:06 · 8983 阅读 · 0 评论 -
typedef struct 和 struct
1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是struct Student的别名。Stu==转载 2017-09-23 18:29:35 · 286 阅读 · 0 评论 -
rand()函数基本用法
1. rand函数生成的是伪随机数,所以同一程序输入的结果总是相同的。因此为了使每次运行时产生不同的随机数,就要用到随机数种子srand函数srand((unsigned)time(NULL));括号中可以不止填time函数,但一般使用上一代码。因为程序执行的速度很快,超过了时间变化的频率,所以只需要在程序的开头种一次种子就可以了。 2. rand()%N+M 表示在[m,m+n)之间的整数M原创 2017-09-23 14:44:47 · 5402 阅读 · 0 评论 -
用sprintf函数将数字转换成字符串
过去我是手写的转换函数:void Int2Str(int x,char *istr) // 将正整数x转换为字符串istr{ char ch,*p,*t; int r; p=t=istr; while(x>0) { r=x%10; x=x/10; *p='0'+r; p++;原创 2017-09-23 10:47:29 · 5799 阅读 · 2 评论 -
动态二维数组
#include<stdio.h>#include<stdlib.h>int main(){ int high,width,i,j; scanf("%d%d",&high,&width); // 用户自定义输入长宽 // 分配动态二维数组的内存空间 int **canvas=(int**)malloc(high*sizeof(int*)); for(i转载 2017-09-23 09:39:34 · 481 阅读 · 0 评论 -
%lf与%f的区别
%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号。其中: float,单精度浮点型,对应%f. double,双精度浮点型,对应%lf.在用于输出时: float类型可以使用%lf格式,但不会有任何好处。 double类型如果使用了%f格式可能会导致输出错误。 (printf中一般可以用%f代替%lf)在用于输入时: double 类型使用了%f格式,转载 2017-08-18 19:09:19 · 8722 阅读 · 0 评论 -
exit(0)与exit(1)、return区别
exit(0):正常运行程序并退出程序;exit(1):非正常运行导致退出程序;return():返回函数,若在主函数中,则会退出函数并返回一值。详细说:return返回函数值,是关键字; exit 是一个函数。return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。return是函数的退出(返回);exit是进程的退出。return是C语言提转载 2017-08-18 11:27:23 · 179 阅读 · 0 评论 -
判断文件结尾的方法(feof函数和EOF)
当以文本方式读写文件时,可以用EOF判断文件是否结尾,因为EOF=-1,而字符的ASCII码不可能为负数。 例如,当fp为文本方式读取的指针时getc(fp)!=EOF可判断是否读到文件结尾当以二进制方式读写文件时,只能用feof函数判断,因为二进制读取数值,可能为负。 feof函数原型为int feof(FILE *stream)当未读到结尾时,返回值为0,读到结尾时,返回值为1feof不仅适原创 2017-08-15 11:38:23 · 8229 阅读 · 0 评论 -
关于scanf与换行符的问题
scanf在读取字符串时,会自动忽略换行符,所以char ch,a[10],b[10]; scanf("%s",a); scanf("%s",b); printf("%s",a); printf("%s",b);当输入abc回车def时,输出abcdef但是换行符还是留在缓冲区中,所以我们在scanf后面应该加上一行getchar();来去掉残留的换行符特别地: sc原创 2017-08-16 11:21:34 · 12522 阅读 · 0 评论