C++
PengPengBlog
激光雷达 点云处理 测绘 遥感 GIS 机器学习 深度学习
展开
-
图文并茂用地址分析双向链表(很清晰!)
网上很多对双向链表解释的文章都是用这个结构: 它们的连接情况是这样的: 相当的不直观,今天我要从详细的地址出发来解释双向链表的原理。 现定义一个结构体如下:struct student{char name;struct student *next;struct student *prior;};转载 2016-09-19 10:24:01 · 415 阅读 · 0 评论 -
typedef
如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法:使用typedef为现有类型创建同义字,定义易于记忆的类型名1typedef int size;12345678910void mea转载 2016-09-09 10:34:19 · 315 阅读 · 0 评论 -
struct和typedef struct(用到看)
struct和typedef struct分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student s转载 2016-09-09 10:13:40 · 364 阅读 · 0 评论 -
C++箴言:理解typename的两个含义
问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template class Widget; // uses "class"template class Widget; // uses "typename" 答案:没什么不同。在声明一个 template type paramet转载 2016-09-16 12:55:24 · 474 阅读 · 0 评论 -
struct和typedef struct
三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是s转载 2016-09-18 15:41:11 · 320 阅读 · 0 评论 -
指针数组和数组指针的区别
这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针数组指针:a pointer to an array,即指向数组的指针还要注意的是他们用法的区别,下面举例说明。in转载 2016-09-19 10:41:30 · 381 阅读 · 0 评论 -
结构体struct和typedef后面接指针的含义
这几天构建TIN的时候一直有这个用法,没讲过,这里搜到看一下,原来是给结构体指针举个别名!在C语言里面,struct是用来定义新的数据类型——结构体,typedef是给数据类型取别名。据说这两个关键词同时使用有助于减少代码量和增加代码的可读性(不过我认为它当typedef和struct在一起的时候反而降低了代码的可读性),很多时候为了方便,我们常常讲stuct与typedef放在一转载 2016-09-20 09:28:13 · 1200 阅读 · 1 评论 -
malloc函数详解
一、原型:extern void *malloc(unsigned int num_bytes);头文件:#include 或 #include (注意:alloc.h 与 malloc.h 的内容是完全一致的。)功能:分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释转载 2016-09-20 09:49:07 · 550 阅读 · 0 评论 -
c语言中realloc()函数解析
realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。如果将分配的内存减少,realloc仅仅是改变索引的信息。如果是将分配的内存扩大,则有以下情况:1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。2)如果当前内存段后面的空闲字原创 2016-09-20 15:10:51 · 742 阅读 · 0 评论 -
关于指针的三个容易弄混淆的概念及发散~~~
于指针来讲,有3个比较容易混淆的概念:指针地址指针保存的地址指针所保存的地址的值在这里,我们分别来看看他们的定义:指针地址:指针自身的地址,即内存中用于存放指针变量的内存地址指针保存的地址:指针所保存的变量在内存中的地址,通俗讲就是指针所指向的对象的内存地址指针所保存的地址的值:指针所指对象的数值。下面,我们用一个具体的例子来看看上面仨个东东的不同~~~转载 2016-09-20 16:11:59 · 614 阅读 · 0 评论 -
结构体struct和typedef后面接指针的含义
在C语言里面,struct是用来定义新的数据类型——结构体,typedef是给数据类型取别名。据说这两个关键词同时使用有助于减少代码量和增加代码的可读性(不过我认为它当typedef和struct在一起的时候反而降低了代码的可读性),很多时候为了方便,我们常常讲stuct与typedef放在一起用。像这样的代码是比较好理解的,就是取FileInfo为sturct file的别名嘛。转载 2016-09-20 20:48:30 · 15206 阅读 · 15 评论 -
受教了
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。试对比图书馆(对图书的分类够结构转载 2016-09-21 15:08:08 · 478 阅读 · 0 评论 -
安全起见,小心使用C语言realloc()函数
在C语言中,良好的编程习惯要求一个函数只做一件事,如果一个函数实现了若干功能,可以说基本是一个糟糕的设计。C语言 realloc() 函数位于 stdlib.h 头文件中,其原型为: void *realloc(void *ptr, size_t size);realloc() 会将 ptr 所指向的内存块的大小修改为 size,并将新的内存指针返回。设之前内存块转载 2016-09-19 14:47:10 · 1299 阅读 · 0 评论 -
malloc函数详解
一、原型:extern void *malloc(unsigned int num_bytes);头文件:#include 或 #include (注意:alloc.h 与 malloc.h 的内容是完全一致的。)功能:分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释转载 2016-10-12 09:45:57 · 476 阅读 · 0 评论 -
malloc函数详解
一、原型:extern void *malloc(unsigned int num_bytes);头文件:#include 或 #include (注意:alloc.h 与 malloc.h 的内容是完全一致的。)功能:分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释转载 2016-10-12 10:51:24 · 311 阅读 · 0 评论 -
vector::erase()方法的详细介绍及问题解答
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素vector::erase()方法有两种重载形式如下:iterator erase( iterator _Where);1.iterator erase( iterator _First, iterator _Last);如果是删除指定位置的元素时:返回值是一个迭代转载 2016-11-04 15:10:42 · 611 阅读 · 0 评论 -
如何拿vector生成二维数组三维数组
#includeusing namespace std;/*#define HEIGHT 5#define WIDTH 3int main(){vector> array2D;//设置容器大小(HEIGHT / WIDTH)//连行都要resize;array2D.resize(HEIGHT);//原来需要每一行都要设置一下大小。for (int i转载 2016-09-29 20:38:43 · 3879 阅读 · 0 评论 -
STL容器vector的内存问题
在STL的容器中,vector可以说是最容易理解和使用的容器了,以前使用数组的时候,如果不确定有多少数据要存储,就会预先分配一个大的数组,如果实际没有用到那么多,又会浪费很多的内存资源,如果不分配大的数组又担心不够用,有了vector之后,这些问题再也不用担心了,vector会动态的增长空间,当vector空间不足时会自动申请一片更大的内存空间,以存储新的数据。 vector动态内转载 2016-09-30 22:13:37 · 596 阅读 · 0 评论 -
C语言中动态分配数组
摘要的重要性是不言而喻的,每次发文章我都很纠结如何写出一个有特色的摘要来,能够以最为简短的文字向读者描述出我所要表达的东西。但是常常出现的问题是,摘要写得太简短了,读者看了不清楚文章究竟要讲啥;摘要写得稍微长点的话自然能够描述清楚所要表达的东西,但是却也出现了另外一个问题,就是读者看到大段的文字描述,觉得枯燥无味,直接二话不说给文章判了个“死刑”,导致这种情况下愿意真正的花时间看完摘要的读者屈指可转载 2016-11-07 16:12:05 · 15984 阅读 · 2 评论 -
算法分析——Hanoi塔问题(还是写不出来啊!)
上图为 3 阶 Hanoi 塔假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至塔座C并按同样的顺序叠排圆盘移动必须遵守下列规则:1:每次只能移动一个圆盘 2:圆盘可以插在任意一个塔座上 3:任何时刻都不能将一个较大的圆盘放在一个较小的圆盘上 该问题的复转载 2016-10-27 14:19:43 · 1138 阅读 · 0 评论 -
防御式编程
防御式编程从防御式编程的角度,你认为下面这个计算平均分的函数有什么问题吗?int Average(int score[], int n) { int i, sum = 0; for (i=0; i { sum = sum + score[i]; } return sum/n;原创 2016-11-08 12:59:25 · 576 阅读 · 0 评论 -
vector用完后需要释放嘛?
如果map,vector中存放了指针,指向手动分配的内存区域,则map,vector生命周期结束时,需要手动释放该内存区。map,vector的析构中带有垃圾回收机制,不需手动清空。记得,手动分配,才需手动清空。原创 2016-11-08 14:26:38 · 12858 阅读 · 3 评论 -
施一公清华大学开学演讲:研究生应具备的“三大素质” (共勉)
各位同学,大家上午好。很高兴有机会与在座的研究生分享我对一些问题的看法。今天我采用的标题是我5年之前在和2010年入学的研究生分享体验时用的标题——“少年壮志不言愁”。这是一首电视剧的主题曲,也是我最喜欢唱的一首歌曲。我想讲的第一部分是我的成长之路。以前我在讲这一部分的时候会讲得特别长,而今天这部分只有一张幻灯片。在座的有些同学可能还转载 2016-10-04 08:59:48 · 1660 阅读 · 1 评论 -
堆栈的深入个人理解
对于堆,栈,堆栈的味道,一直就跟猪八戒吃啥来着,从没有细细地品尝过。发了下狠心,各个网页看了很多,这里就把我东抓西拼的东西整理整理。 一 这些个概念怎么来的以及怎么记得住这里,只限于整理我个人对堆/栈/堆栈在内存管理方面的理解。其他,在数据结构方面讲的堆/栈目前不在我整理范围之内。这里提了三个概念: 堆,栈,以及堆栈。我把栈和堆栈的概念等同了。所以,接下来只要把两转载 2016-10-05 09:08:15 · 892 阅读 · 0 评论 -
C/C++野指针
C/C++野指针一、莫名的恐惧感 对于指针确实有种莫名的恐惧感,从刚开始学习的时候就被老师灌输的概念是指针功能很强大,但是用得不够好,会有很大的副作用。什么叫用得够好?初学者谁都不会用,那且不是都不能用了?如果都这样,指针都没人用了,还要指针做什么? 陷入了上述困局的原因在于我们的这种莫名的恐惧感,指针如此之神秘,以至于如我一转载 2016-10-06 11:17:27 · 518 阅读 · 0 评论 -
关于链表以及结构体指针别名的思考
/*#include "malloc.h" #include "stdio.h" typedef int DataType; typedef struct Node { DataType data; struct Node *next; }LNode,*PNode,*LinkList;原创 2016-09-21 15:31:00 · 947 阅读 · 0 评论 -
C语言中static变量详解
google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大。所以,我这篇博文博采众家之长,把互联网上的资料整合归类,并亲手编写程序验证之。 C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果转载 2016-10-20 16:49:43 · 7940 阅读 · 0 评论 -
气泡法排序
起泡法是从一端开始比较的,第一次循环就是把最大数放到最后一个位置,第二次循环就是把第二最大数放到倒数第二位置。整个过程就像烧开水一样,较小值像水中的气泡一样逐趟往上冒,每一趟都有一块“最大”的石头沉到水底。#include using namespace std; int main() { int a[10]; int i,j,temp;原创 2016-11-29 09:52:19 · 4343 阅读 · 1 评论 -
最小二乘法原理与计算方法
可以先通过这里来理解一下 线性拟合和二次拟合方程http://wenku.baidu.com/link?url=cr0U9oPZ4KxO-s34ORBolH42hjux2dwH2DtRJEKTI0xsiDk2y28wyU6ZLlbRSQfCNhtdlz0nORxEYQ94n-MLITaMFR2PbVel-s_KJXpV1mG随后可以通过这里http://wenku.baid原创 2016-11-09 20:22:45 · 5749 阅读 · 0 评论 -
%02d得意思是什么?
格式符%02d中2d前面的前导符0表示输出数据时,若左边有多余位,则补0。利用这种输出格式,编程输出下面的信息。#include typedef struct date{ int year; int month; int day;} DATE;typedef struct student{ long id; char name[10];原创 2016-12-12 14:33:05 · 8057 阅读 · 0 评论 -
C++动态创建二维数组,二维数组指针,以及动态二维数组函数传递
int **result; int row = 4; int col = 5; result = new int*[row]; for (int i=0; i{ result[i] = new int[col]; } for (int i=0; i{ for (int j=0; j {原创 2017-01-03 13:34:26 · 2123 阅读 · 0 评论 -
c语言数据结构补齐原则
/* 原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct转载 2017-01-06 16:16:14 · 516 阅读 · 0 评论 -
*&p表示什么意思?
void main(){int *a;int *&p=a;int b=10;p=&b;}int a=10;int p=a;这种情况,p与a是不同的变量,这里是将a的值赋给pint &p=a; 即 p是a 的别名,p和a其实是同一个整形变量,两个占用同一块内存空间,如果有 p=15;那么a也是15,修改p与修改a是完全等价的那么int *a;int * &p=转载 2017-03-03 09:01:50 · 5124 阅读 · 0 评论 -
当出现内存泄漏的时候
处理点云的时候,会有几十万甚至上万的个点,申请内存的时候,我用最具体的数目进行申请的,XYZ *p = new XYZ[max];以为这样更节省内存,处理的时候也出现了结果,但是问题是发生了内存泄漏,找不到原因。然后我申请内存的时候,就把max多加了3。XYZ *p = new XYZ[max+3];随后问题解决. 这仅仅是个trick,以后遇到这样的问题希望能用更专业原创 2017-03-27 15:15:33 · 457 阅读 · 0 评论 -
Main函数参数argc,argv如何传入
方法1.C/C++语言中的main函数,经常带有参数argc,argv,如下:int main(int argc, char** argv)int main(int argc, char* argv[])这两个参数的作用是什么呢?argc 是指命令行输入参数的个数,argv存储了所有的命令行参数。假如你的程序是hello.exe,如果在命令行运行该程序,(首先应该在命令转载 2017-03-27 20:37:04 · 681 阅读 · 0 评论 -
typedef和define具体的详细区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:#define PI 3.1415926程序中的:area=PI*r*r 会替换为3.1415926*r*r如果你把#define语句中的数字9 写成字母g 预处理也照样带入。2)typedef是在编译时处理的。它在自己的作用域内给一转载 2017-03-21 09:49:07 · 430 阅读 · 0 评论 -
关于库的编译
如果一个库已经在编译过了 而且也是在window系统 vs10.0 上编译过了,那么在自己电脑上就不需要编译,直接拿来用就行了。原创 2017-03-28 21:17:44 · 377 阅读 · 0 评论 -
CGAL BOOST 以及对如何安装库的思考
最近要做构三角网,所以用GDAL,但是据说 GDAL 速度很慢= =! 没有cloudcomapre的速度快,所以我还是先试试cloudcompare的库吧 = =!每次加新库都感觉很麻烦啊! 老是出现各种意外! 什么找到lib文件之类的!!! 非常烦人。因为不懂这个原理啊! 所以这里总结一下。如果要#include 需要这样做:需要对外来库进行编译。 这里先普及一些基本名词:原创 2017-03-30 12:52:33 · 924 阅读 · 0 评论 -
静态变量和非静态变量
#includeint fun(int n){ static int f=1; f=f*n; return f;}void main(){ int i; for(i=1;i<=5;i++) printf("fun(%d)=%d\n",i,fun(i));}给读者一个简单直白的例子(区别静态局部变量和动态局部变量):原创 2017-04-01 12:27:52 · 562 阅读 · 0 评论 -
c++ 类作用域中的名字查找
一.类成员声明的名字查找 按以下方式确定在类成员的声明中用到的名字 什么叫做类成员声明的名字呢? 就是声明一个函数用到的类型。 比如 doube max(x, y) 其实double 就是类成员声明的名字。* 先检查出现在名字使用之前的类成员声明* 如果第一不查找不成功,则检查包含类定义的作用域中出现的声明以及出现在类定义之前的声明.例如:typ转载 2017-04-05 15:03:57 · 595 阅读 · 0 评论