![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++常见错误集锦
zwz2011303359
这个作者很懒,什么都没留下…
展开
-
快速排序的优化
参考:http://blog.taoaili999.cn/2017/06/29/QuickSort-Optimization/ 快速排序的思想是分治法,当每次划分时,算法若都能分成两个等长的子序列时,那么分治算法效率会达到最大。所以基准枢纽元的选择是很重要,选择基准的方式决定了分割后两个子序列的长度,进而对整个算法的效率产生决定性影响。 通常实现的快速排序没有经过充分考虑的选择那个枢纽元,...转载 2018-08-24 11:02:58 · 343 阅读 · 0 评论 -
固定数组随机数
固定数组随机数有时候需要固定数量随机数,但是要保证这些随机数都在一定的范围内且这些随机数不一样。方法1,将其产生的随机数放入一个vector中,每次放入数据的时候对vector进行find,find失败则放入数据。这种方法就不贴代码了,因为性能不高,要是想要一个100万条的随机数,不知何时程序才能执行完,因为find的效率太低了。方法2,将随机数插入set容器中,因为set容器保证插入的数据不一致,转载 2017-04-26 22:11:13 · 427 阅读 · 0 评论 -
函数指针和指针函数
指针函数int *f(int a, int b); 函数指针int (*f)(int a, int b); // 声明函数指针 * * 求最大值 * 返回值是int类型,返回两个整数中较大的一个 */ int max(int a, int b) { return a > b ? a : b; } /* * 求最小值 * 返回值是int类型,返回两个整原创 2017-05-08 21:50:00 · 229 阅读 · 0 评论 -
不用中间变量交换两个数
第一种方法:void swap(int &a,int &b){ a=a+b; b=a-b; a=a-b;}第二种方法:void swap2(int &a,int &b){ a=a^b; b=a^b; a=a^b;}原创 2017-05-17 00:34:31 · 268 阅读 · 0 评论 -
c++好玩的东西
Class 的大小一个空 class 的大小为 1 字节,因为编译器需要安插进去一个 char,使得这个 class 对象得以在内存中被配置独一无二的地址。虽然空 class 大小为 1 字节,但是假如某个类 A 继承该空 class,计算类 A 的大小时会优化父类空 class 的大小,如类 A 为空,sizeof(A) = 1,不空,则为类A真实数据大小。 我们通常说某个 class 内部有原创 2017-04-23 17:10:10 · 1614 阅读 · 0 评论 -
c++对象模型
何为C++对象模型? C++对象模型可以概括为以下2部分: 1、语言中直接支持面向对象程序设计的部分; 2、对于各种支持的底层实现机制。 语言中直接支持面向对象程序设计的部分,如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等。本文重点介绍底层实现机制。 在C语言中,“数据”和“处理数据的操作(函数)”是分开声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性原创 2017-04-23 15:40:32 · 285 阅读 · 0 评论 -
为什么析构函数是虚函数
#include <iostream>using namespace std;class ClxBase{public: ClxBase() {}; ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;}; void DoSomething() { cout << "Do s原创 2017-04-23 13:52:00 · 361 阅读 · 0 评论 -
红黑树相对于普通平衡二叉树的优点
黑树属于平衡二叉树。它不严格是因为它不是严格控制左、右子树高度或节点数之差小于等于1,但红黑树高度依然是平均log(n),且最坏情况高度不会超过2log(n)。 红黑树(red-black tree) 是一棵满足下述性质的二叉查找树: 1. 每一个结点要么是红色,要么是黑色。 2. 根结点是黑色的。 3. 所有叶子结点都是黑色的(实际上都是Null指针,下图用NIL表示)。叶子结点不包含任何转载 2017-04-30 00:36:34 · 7422 阅读 · 0 评论 -
vector的内存分配
stl中有个很重要的东西就是vector,开发中会经常用到,至少我是经常使用,vector的存在可以使开发者不必关心内存的申请和释放。但是,vector的一个缺点就是它的内存分配是按照2的倍数分配内存的。当当前容量对插入元素不够时,分配一块新的内存,这块内存的容量是原vector容量的2倍大小,然后复制旧内存,释放旧内存,可能多次涉及拷贝构造函数和析构函数,如果一个程序需要的内存超过2G的话,那么就原创 2017-04-30 00:27:54 · 1065 阅读 · 0 评论 -
socket通信介绍
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket翻译 2017-04-18 16:51:54 · 570 阅读 · 0 评论 -
字符串函数strcpy,出现的字符截断问题
#include <iostream>#include <string>#include <conio.h>#include <cstdlib>using namespace std;int main(){ char s[]="123456789"; char r[]="1234"; strcpy(r,s); cout<<s<<endl; cout<原创 2017-04-14 12:50:27 · 1399 阅读 · 0 评论 -
数据库事务四个特点
数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做要么全不做,是一个不可分割的工作单位。 数据库事务的四大特性(简称ACID)是: (1) 原子性(Atomicity) 事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。 例如银行取款事务分为2个步骤(1)存折减款(2)提取现金。不可能存折转载 2017-04-14 12:27:08 · 497 阅读 · 0 评论 -
C++ const用法大全
1.const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。 对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。例如: const int nValue; //nVal转载 2017-04-05 18:56:50 · 220 阅读 · 0 评论 -
new int 和 new int()的区别
对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加() /*此处摘抄与大佬*/new(多个对象)数组 new分配的对象,不管单个对象还是多个对象的分配,都是默认初始化。但可以对数组进行值初始化,方法就是:在大小之后添加一对空括号。12int *pia...原创 2018-06-30 23:22:09 · 24800 阅读 · 1 评论 -
C++内存管理
栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。自由存储区,就是那些由malloc等分配...原创 2018-08-11 23:18:42 · 185 阅读 · 0 评论 -
static的用法(记忆性)
static用法小结 static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准).(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数下面就这三种使用方式及注意事项分别说明一、局部静态变量在C/C++中, 局部变量按照存储形式可分为三种auto, stat...转载 2018-07-07 17:31:18 · 991 阅读 · 0 评论 -
深拷贝和浅拷贝的区别
深浅拷贝的区别: 浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。 深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生...转载 2018-07-07 17:14:16 · 429 阅读 · 1 评论 -
typeof和Define
typedef是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。 #define是预处理指令。下面让我们一起来看。typedef是C语言语句,其功能是用户为已有数据类型取“别名”。 例如: typedef int INTEGER; 这以后就可用INTEGER来代替int作整型变量的类型说明了,如: INTEGER a,b; 用type...转载 2018-07-07 14:17:23 · 1071 阅读 · 0 评论 -
C++程序内存分配
在现代的操作系统中,当我们说到内存,往往需要分两部分来讲:物理内存和虚拟内存。从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间。一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式。从低地址到高地址,可分为下面几段: 预留内存地址(操作系统维护的内存地址,不可访问) 程序代码区(只读,存代码和一些其他的东西); dat...转载 2018-07-06 23:53:36 · 231 阅读 · 0 评论 -
指针和引用的区别
1.指针和引用的定义和性质区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:int a=1;int *p=&a;int a=1;int &b=a;上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。而下面2句定义了一个整形变量a...原创 2018-07-05 23:17:17 · 160 阅读 · 0 评论 -
纯虚函数和虚函数的区别
首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。1、简介假设我们有下面的类层次:class A{public: virtual void foo() { c...转载 2018-07-05 20:56:14 · 171 阅读 · 0 评论 -
C++虚函数的实现机制
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的阐述...转载 2018-07-05 20:07:27 · 290 阅读 · 0 评论 -
C++多态的实现
C++是面对对象的程序设计。面对对象的程序设计有4大特性:分别是,抽象、封装、继承、多态。今天我们就来总结一下多态的内容。多态:分为静态多态和动态多态:#include<iostream>using namespace std;int Add(int a,int b)//1{ return a+b;}char Add(char a,char b)//2{ ...原创 2018-07-05 15:51:19 · 140 阅读 · 0 评论 -
STL之Stringstream字符串流使用总结(转)
如果你已习惯了<stdio.h>风格的转换,也许你首先会问:为什么要花额外的精力来学习基于<sstream>的类型 转换呢?也许对下面一个简单的例子的回顾能够说服你。假设你想用sprintf()函数将一个变量从int类型转换到字符串类型。为了正确地完成这个任 务,你必须确保证目标缓冲区有足够大空间以容纳转换完的字符串。此外,还必须使用正确的格式化符。如果使用了不正确的格式化...转载 2018-07-05 14:08:28 · 290 阅读 · 0 评论 -
火车进站
题目描述给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。 输入描述: 有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9。输出描述: 输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开...转载 2018-07-17 17:21:58 · 996 阅读 · 0 评论 -
动态规划 | 带有通配符的字符串匹配
动态规划 | 带有通配符的字符串匹配(浅显易懂)时间:2015-08-15 06:46:15 阅读:5178 评论:0 收藏:0 [点我收藏+]标签:动态规划 wildcard leetcode 字符串匹配 通配符 带有通配符的字符串匹配一、Leetcode | 44 Wildcard Matching(只有一个字符串包含...转载 2018-07-17 12:50:47 · 2580 阅读 · 0 评论 -
C++中参数传递的方式
在C++中,参数传递的方式是“实虚结合”。 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass by reference) 按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用原创 2017-04-05 17:41:14 · 423 阅读 · 4 评论 -
指向const的指针和const指针的区别
const int*u;u是指向const int类型的指针。u不需要初始化,因为u是一个可以指向任何标识符的,但他指向的值是不可以被改变的。 想对比的是const指针int d=1;int *const V=&d;这是一个const指针必须把const标明放在*右边。 总之:我们看const放在int前面那么他修饰的是常量表示指针指向的是一个常量,而如果const修饰的是一个指针,那么表示该原创 2017-04-05 17:15:35 · 333 阅读 · 1 评论 -
句柄和指针的区别
句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。当你需要对某个内存进行直转载 2017-04-10 10:28:55 · 435 阅读 · 0 评论 -
迷途指针和空指针
#include <iostream>using namespace std;int main(){ int *p=new int; *p=10; cout<<*p<<endl; delete p; p=0; *p=20;//this is deleted cout<<*p;}迷途指针:当对一个指针执行delete操作后,这样会释放它所原创 2017-04-10 01:31:05 · 265 阅读 · 0 评论 -
(int*)(&a+1)
int a[]={1,2,3,4,5}; int *ptr=(int *)(&a+1);cout<<*(a+1)<<" "<<*(ptr-1);5 a本身就是一个指针,&a相当于一个指向原创 2017-04-10 01:11:23 · 745 阅读 · 0 评论 -
指针数组和数组指针
#include <iostream>using namespace std;int main(){ int V[2][10]={{1,2,3.4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}}; int (*a)[10]=V;//数组指针 cout<<**a<<endl; cout<<**(a+1)<<endl;原创 2017-04-10 00:41:46 · 192 阅读 · 0 评论 -
虚函数表解析
C++ 虚函数表解析陈皓 http://blog.csdn.net/haoel前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到转载 2017-04-09 14:16:35 · 197 阅读 · 0 评论 -
数组指针错误解析
#includeusing namespace std;int main() { int a[4] = { 1,2,3,4 }; int *ptr = *(&a + 1); printf("%d", *(ptr - 1)); system("pause");}输出结果为:4#includeusing namespace std;int main() {原创 2017-03-30 10:49:05 · 290 阅读 · 0 评论 -
c++构造函数的调用顺序
#includeusing namespace std;class B{public: B() { cout } ~B() { cout } B(int i) : data(i) { cout }private: int data;};B Play(B b){ return b;}int mai原创 2017-03-30 10:24:57 · 251 阅读 · 0 评论 -
结构体的sizeof
struct _THUNDER{ int iVersion; char cTag; char cAdv; int iUser; char cEnd;}Thunder;int sz = sizeof(Thunder);1运算结果为16:原因是因为原创 2017-03-30 09:22:13 · 190 阅读 · 0 评论 -
c++不能重载的运算符
C++允许重载的运算符C++中绝大部分运算符都是可以被重载的。不能重载的运算符只有5个:. (成员访问运算符).* (成员指针访问运算符):: (域运算符)sizeof (长度运算符)?: (条件运算符)前两个运算符不能重载是为了保证访问成员原创 2017-03-30 08:59:02 · 279 阅读 · 0 评论 -
C++面试题解析
1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自转载 2017-04-07 15:03:03 · 161 阅读 · 0 评论 -
指针数组和数组指针的区别
这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。 指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针 数组指针:a pointer to an array,即指向数组的指针 还要注意的是他们用法的区别,下面举例说明。 int* a[4]原创 2017-04-07 16:38:53 · 176 阅读 · 0 评论 -
结构体大小的计算
结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。看下面这样的一个结构体: struct stu1 { int i; char c; int j; }; 先介绍一个相关的概念——偏移量。偏移量指的是结构体变量原创 2017-04-07 15:56:18 · 290 阅读 · 0 评论