![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++学习
从零开始学习的ZHL
已工作但很弱鸡的学习者
展开
-
vector erase
今天做笔试题时,一道很简单的题,思路特别简单,但由于我erase老是出问题,最后就没通过,好气啊。 erase返回值是一个迭代器,由于指向的元素被删了,后面的元素会上来(我看STL源码剖析的图),它指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素。调用erase()后迭代器就失效了,变成了一野指针,所以要记得给他重新赋值。...原创 2018-09-07 18:52:58 · 1676 阅读 · 1 评论 -
C++函数重载
转自:https://blog.csdn.net/zhanghow/article/details/53588458在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下...转载 2018-08-15 09:37:34 · 133 阅读 · 0 评论 -
C++模板
转的,先将就看着。模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 模板是一种对类型进行参数化的工具; 通常有两种形式:函数模板和类模板; 函数模板针对仅参数类型不同的函数; 类模板针对仅数据成员和成员函数类型不同的类。 使用模板的目的就是能够让程序员编写与类型无关的代...转载 2018-07-27 14:56:20 · 118 阅读 · 0 评论 -
比较完整的字符串转换为整数
要考虑到各种情况,比如,正负数,特别大或特别小的,有不合法字符的。用一个全局变量标记输入是否合法,不要随便就return 0;测试了正数,负数,有字母,很大的数,很小的数,空串6中情况#include<iostream>using namespace std;enum Status{Valid,Invalid};int g_Status = Valid;//用一个全局变量来...原创 2018-08-03 20:07:54 · 133 阅读 · 0 评论 -
C++ volatile关键字
访问寄存器要比访问内存要块,因此CPU会优先访问该数据在寄存器中的存储结果,但是内存中的数据可能已经发生了改变,而寄存器中还保留着原来的结果。为了避免这种情况的发生将该变量声明为volatile,告诉CPU每次都从内存去读取数据。 一个参数可以即是const又是volatile的吗?可以,一个例子是只读状态寄存器,是volatile是因为它可能被意想不到的被改变,是const告诉程序不应该试图去...转载 2018-07-30 11:53:39 · 122 阅读 · 0 评论 -
C++11新标准:decltype关键字
转自:https://www.cnblogs.com/cauchy007/p/4966485.html一、decltype意义 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了)。为了满足这一需求,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型...转载 2018-07-30 11:32:23 · 212 阅读 · 0 评论 -
函数指针
转自:https://www.cnblogs.com/huangzhenxiong/p/7772627.html函数指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特定类型,函数的类型由它的返回类型和形参类型共同决定,与函数名无关。bool LengthCompare(const string &,const string &)该函数的类型是bool(con...转载 2018-07-30 11:13:00 · 95 阅读 · 0 评论 -
C++内存泄漏与检测
定位内存泄露 (1)在windows平台下通过CRT中的库函数进行检测; (2)在可能泄漏的调用前后生成块的快照,比较前后的状态,定位泄漏的位置;(3)Linux下通过工具valgrind检测; 下面转自:https://blog.csdn.net/KangRoger/article/details/39317503C++中的内存泄露一般指堆中的内存泄露。堆内存是我们手动mall...转载 2018-07-30 11:01:09 · 215 阅读 · 0 评论 -
空悬指针和野指针区别
空悬指针是:它曾经指向一个有效地址,但是现在不再指向有效地址,就是原来的那块地址不能通过这个指针区访问了。这通常是因为指针所指的内存单位被释放了并且不再有效了。空悬指针存在并没有什么问题,除非你尝试通过这个指针访问指向的地址空间。不遗留任何悬空指针总是最好的实践方式。野指针是这样一种指针:它没有被正确的初始化于是指向一个随机的内存地址。存在野指针是一个严重的错误...原创 2018-07-30 10:39:01 · 689 阅读 · 0 评论 -
C++强制类型转换
这篇也可以:https://blog.csdn.net/jsc0218/article/details/21567687下面是转自:https://www.cnblogs.com/Allen-rg/p/6999360.htmlC++ 类型转换(C风格的强制转换):在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型,布尔型。其中数值型包括 整型与浮点型;字符型即为char。...转载 2018-07-30 09:54:59 · 11598 阅读 · 1 评论 -
C++构造函数
必须在构造函数初始化式里进行初始化的数据成员有哪些 (1) 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 (2) 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 (3) 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化 C++中的构造函数可以分为4类: (1)默认构造...转载 2018-07-26 12:02:35 · 755 阅读 · 0 评论 -
C++动态绑定和静态绑定
学习大佬的总结:https://blog.csdn.net/chgaowei/article/details/6427731为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。需要理解四个名词:1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。2、对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态...转载 2018-07-26 10:34:44 · 107 阅读 · 0 评论 -
const与重载
《C++ primer》一书中这样描述:“可基于函数的引用形参是指向 const 对象还是指向非 const 对象,实现函数重载。将引用形参定义为 const 来重载函数是合法的,因为编译器可以根据实参是否为 const 确定调用哪一个函数。” 转自:https://blog.csdn.net/polarbearboy/article/details/6762752const到底是不是...转载 2018-08-15 09:46:39 · 749 阅读 · 0 评论 -
C++运算符重载
转自:https://blog.csdn.net/hyman_c/article/details/52954445 我们知道在C++中可以通过重载运算符的方式,使类实现类似于基本类型的运算符操作,如+、-、*、/等等。本文介绍这种重载运算符的两种方法。我们先自定义一个类,来作为本次研究的对象: class Integer{public:Integer(){}...转载 2018-08-15 10:15:14 · 138 阅读 · 0 评论 -
静态成员变量与静态成员函数
转自:https://www.cnblogs.com/kiplove/p/6875371.html原文最后有个小错误,没有加const,这里给加上。 一、静态成员变量类的静态成员变量是直接与类联系,属于类的成员而不是对象,供所有对象共享,存放于全局区,因而不计入类的内存计算。静态成员变量可以通过类直接访问。(1)静态成员变量的初始化静态成员不属于类的任何对象,所以并不是...转载 2018-08-15 11:37:28 · 153 阅读 · 0 评论 -
C++生成指定范围的随机小数
网上查怎么生成小数的随机数,一直查不到我想要的。C++新标准,有一个叫随机数引擎的东西。包含于头文件 <random>随机数库由:引擎,分布组成。具体可参考《C++ primer》#include<random>#include<iostream>using namespace std;int main(){ default_ran...原创 2018-09-08 21:18:26 · 23151 阅读 · 5 评论 -
C++从txt文件读取数据保存为二维数组
比如数据这样,不管他中间的空格多少最后保存为数组后,效果如下:#include<iostream>#include<fstream>#include<sstream>#include<vector>using namespace std;int main(){ ifstream f; f.open("data.t...原创 2018-09-08 18:52:21 · 9652 阅读 · 10 评论 -
《Effective C++》学习笔记
构造/析构/赋值运算:条款5:了解C++默默编写并调用哪些函数。编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符,以及析构函数。 条款6:若不想使用编译器自动生成的函数,就该明确拒绝。为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。如果不慎调用,会得到一个连接错误。也可以...原创 2018-09-04 17:35:25 · 352 阅读 · 0 评论 -
C++继承和组合
主要是IS-A关系和HAS-A关系转自:http://www.cnblogs.com/xiaozz/p/6448250.htmlC++程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及到两个概念,一个是继承(Inheritance),一个是组合(Composition)。因为二者有一定的相似性,往往令程序员混淆不清。类的组合和继承一样,是软件重用的重要方式。组合和继承...转载 2018-08-25 09:17:49 · 5682 阅读 · 0 评论 -
指针数组和数组指针
#include<stdio.h>#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;...原创 2018-08-16 16:39:20 · 107 阅读 · 0 评论 -
继承(派生类的三种继承方式,多重继承,虚继承)
前半部分来自:https://www.cnblogs.com/Rosanna/p/3331578.html 继承性是面向对象程序设计的第二大特性,它允许在既有类的基础上创建新类,新类可以继承既有类的数据成员和成员函数,可以添加自己特有的数据成员和成员函数,还可以对既有类中的成员函数重新定义。利用类的继承和派生实现了更高层次的代码可重用性,符合现代软件开发的思想。 C++语言同时...原创 2018-08-16 12:09:24 · 8309 阅读 · 0 评论 -
extern用法
转自:https://www.cnblogs.com/Lunais/p/5991135.html在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。1. extern修饰变量的声明。如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的...转载 2018-08-18 09:56:38 · 276 阅读 · 0 评论 -
不能把虚函数定义为内联函数
参考:https://blog.csdn.net/coolwriter/article/details/78724851内联函数的目的是为了减少函数调用时间。它是把内联函数的函数体在编译器预处理的时候替换到函数调用处,这样代码运行到这里时候就不需要花时间去调用函数。但内联函数有个缺点是它会增加执行文件大小。所以如果不适当的使用内联函数会造成执行文件特别大。而使用内联函数有以下几点需要注意:...转载 2018-08-15 20:13:27 · 323 阅读 · 0 评论 -
C++友元
转自:https://www.cnblogs.com/zhuguanhao/p/6286145.html有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。 友元(friend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类,友元的声明以friend开始...转载 2018-08-15 19:54:44 · 108 阅读 · 0 评论 -
大端小端的判断
大端字节序(big-endian)是一种将数据高有效位存放在低内存地址的方式,而数据低有效位存放在高内存地址。如图是大端机多字节字节序: 如果是带位域的话,比如一个占一字节的结构体:struct S{ unsigned char x1 : 2, x2 : 6;};struct S s = {s.x1 = 0x0, s.x2 = 0xA...原创 2018-08-15 16:30:00 · 1299 阅读 · 0 评论 -
智能指针和数组
转自:http://www.cnblogs.com/darkknightzh/p/5462363.html 默认情况下,std::shared_ptr会调用delete来清空内存。当使用new[] 分配内存时,需要调用delete[] 来释放内存,否则会有内存泄露。可以通过以下代码来自定义释放内存的函数: 1 template< typename T >2 st...转载 2018-08-15 11:48:13 · 1537 阅读 · 0 评论 -
strcpy
实现strcpy1.注意const2.使用断言检查指针的有效性3.返回char*,为了实现链式表达式,返回具体值需要给源字符串和目标字符串留足够的空间/**实现strcpy*/#include<iostream>#include<cassert>using namespace std;char* Mystrcpy(char* strDes...原创 2018-07-20 16:23:05 · 328 阅读 · 0 评论 -
(转)new和delete实现原理
转自:https://blog.csdn.net/passion_wu128/article/details/38966581new和delete最终调用malloc和free,关于malloc和free实现原理参见这篇文章:http://blog.csdn.net/passion_wu128/article/details/38964045newnew操作针对数据类型的处理,分...转载 2018-07-26 09:50:47 · 468 阅读 · 0 评论 -
堆和栈的差别
需要操作的内存分为:栈区stack:由编译器自动分配和释放,存放函数的参数值、局部变量的值等。其操作类似于数据结构中的栈堆区heap:一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。它与数据结构中的堆是两回事,分配方式倒是类似于链表。全局区(静态区)static:全局变量和静态变量的存储时放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量...原创 2018-07-12 22:01:29 · 557 阅读 · 0 评论 -
C++函数重定义、重载、重写的区别
转自:https://blog.csdn.net/qq844352155/article/details/313811211. 重写 (override): 父类与子类之间的多态性。子类重新定义父类中有相同名称和参数的虚函数。1) 被重写的函数不能是 static 的。必须是 virtual 的 ( 即函数在最原始的基类中被声明为 virtual ) 。2) 重写函数必须...转载 2018-07-23 20:41:49 · 640 阅读 · 0 评论 -
vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因
在一个vector的尾部之外的任何位置添加元素,都需要重新移动元素。而且,向一个vector添加元素可能引起整个对象存储空间的重新分配。重新分配一个对象的存储空间需要分配新的内存,并将元素从旧的空间移到新的空间...原创 2018-07-23 20:19:03 · 4943 阅读 · 0 评论 -
const,#define
int b = 500;const int* a = &b;//1int const *a = &b;//2int* const a = &b;//3const int* const a = &b;//4如果const 位于星号左侧,则const是用来修饰指针所指向的变量,即指针指向为常量如果const 位于星号右侧,const就是修饰指针本身,即...原创 2018-07-10 20:00:39 · 96 阅读 · 0 评论 -
测试是不是乱码
#include<iostream>using namespace std;int main(){return 0;}原创 2018-06-26 19:07:42 · 306 阅读 · 0 评论 -
波兰式与逆波兰式
从这篇博客学习到的:点击打开链接一、波兰式波兰式是在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之前,所以,这种表示法也称为前缀表达式。例如:3*(2-(5+1)),用波兰式来表示是:* 3 - 2 + 5 1。阅读这个表达式需要从左至右读入表达式,如果一个操作符后面跟着两个操作数时,则计算,然后将结果作为操作数替换这个操作符和两个操作数,重复此步骤,直至所有操作符处理完毕...转载 2018-05-16 20:46:29 · 7657 阅读 · 0 评论 -
目前做题过程自己常用到的函数总结
itoa char *itoa(int value,char *string,int radix),其中 radix指定整数value的转换进制,可以取值为2、8、10、16,该函数实现的功能是将整数value转换成指定进制的字符串存入string。atoi int atoi(char *nptr),该函数实现的功能是将字符串转换成整数;在转换过程中,跳过前面的空格字符,直到遇上数字...原创 2018-05-16 20:38:57 · 114 阅读 · 0 评论 -
C++动态申请二维数组并释放
学习这个博客: https://blog.csdn.net/u012027907/article/details/16370625原创 2018-05-16 22:35:24 · 217 阅读 · 0 评论 -
2018华为软挑总结
作为菜鸡,最后分数231.811,进了个64,但没进复赛,其实挺有希望进复赛的,哎,练习阶段的最后次提交都是前20,由于被浪费了很多次提交机会后,最后只调了一次参数,就没机会了,哎,还是知足常乐吧,至少还有个入围(笑cry)。发现和大佬差距真大,学习路途遥远啊题目大致是需要我们根据各个规格虚拟机的历史数据预测下一个时期的虚拟机数量,然后对预测出来的各个规格的虚拟机进行放置。需要资源利用率最大化主要...原创 2018-04-16 22:51:09 · 1949 阅读 · 0 评论 -
写于第一次参加极限编程之后
最近几个月开始真正的学习编程,刚好有个IEEExtream比赛,就和小伙伴组队参加了,当然,结果如一开始预料,被虐的很惨。有些题目能做。有些题目由于大数,虽然看起简单,但是要超时,时间真是大问题,所以以后我要多注重算法,尽量做到用更快的算法解决问题。还有很多经典常见题目需要练习,看过书后要多动手解决练习题。还有很多比赛题目是关于图的,由于自己才学了图,没怎么练习过,所以无从下手,在之后的学习中,还原创 2017-10-16 11:08:09 · 262 阅读 · 0 评论 -
第一个简陋版贪吃蛇终于成功了
在学习了一点链表知识后,花了一天多的时间,写了个极其简易版的贪吃蛇,反正在写之前觉得麻烦,写了之后觉得要写简易版的话,不是太难。在这里把思路记录下来:1.初始化。对各种信息初始化,比如蛇的结构,生命值,初始运动方向,产生食物等2.游戏主体用一个while(life)的循环,生命值为0时,游戏就结束3.首先判断键入,根据键入值确定移动方向,WASD分别代表不同的值,利用switch()确原创 2017-08-28 20:52:41 · 370 阅读 · 0 评论 -
C++三大特性——封装
转自:https://www.cnblogs.com/quincyhu/p/5867468.html什么是封装?封装: 封装可以隐藏实现细节,使得代码模块化封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。在面向对象编程上可理解为:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。数据抽象数据抽象是指,只向外界...转载 2018-07-24 17:13:56 · 226 阅读 · 0 评论