![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++ 学习笔记
JackZhangNJU
未来的路还很长
展开
-
#pragma once 和 #ifndef 的联系和区别?
组织头文件的时候,编译时经常会遇到重复定义的error,这个问题的根源在于一个文件被include多次,如何解决这个问题呢?有下面两种方式1 #ifndef方式比如: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 一些声明语句 #endif2 #pragma once方式比如:#pragma on...原创 2019-08-04 13:04:32 · 411 阅读 · 0 评论 -
C++ Primer 学习笔记:读取string
这里主要总结一下,读取string的几种方式cin等输入流这里主要涉及到cin,stringstream等等输入流,string s;cin>>s;stringstream ss;ss>s;这就是从输入流中把数据读取到字符串s中,其中遇到空额即停止,也就是按照空格分割的getline读取一整行有很多时候我们需要读取一整行的数据,这一行中有空格,那么直接使原创 2017-12-30 20:45:09 · 205 阅读 · 0 评论 -
C++ Primer 学习笔记:浮点数精度问题
之前做过LFF Solver的时候遇到了浮点数的精度问题,因为浮点数计算到一定的精度之后的计算结果就全靠运气了。这个本身是由于浮点数本身是按照科学计数法来存储的,在坐标轴上的分布是很不均匀,越靠近0浮点数越密集,越远离0浮点数越稀疏,所以在远离0的大的浮点数存在大数吃掉小数的情况,那么浮点数的精度(分辨率)在坐标轴上不同的位置也是不一样,越靠近0,精度越高,反之越低。那么在计算机制单精度f原创 2017-12-29 20:51:23 · 537 阅读 · 0 评论 -
C++学习笔记26 size()、length()等函数的返回值的问题
c++ string类length()、size()等函数返回值属于无符号数首先看一个例子string s = "";for(int i = 0; i s.length() - 1; ++i){ cout "s.length = " s.length() << endl; break;}输出结果:s.length = 0string类的length()原创 2017-10-27 12:09:14 · 3793 阅读 · 0 评论 -
C++学习笔记14 V-Tables && 虚继承
很感谢这位博主,写的很棒, C++ 虚函数表解析这位博主针对无覆盖继承、有覆盖继承、多继承等等讲的很细致。还有这一篇C++ 多继承和虚继承的内存布局 技术点满满。这一篇讲的更加详细。还有这一篇关于内存布局讲的很清楚c++对象内存布局这一篇写了较多的关于继承的sixeof的问题,写的不错, C++ 深入理解 虚继承、多重继承和直接继承对于虚继承简单来说就如下图:注意...原创 2017-09-12 21:18:18 · 587 阅读 · 0 评论 -
C++ STL的Traits 特征萃取
traits,又被叫做特性萃取技术,说得简单点就是提取“被传进的对象”对应的返回类型,让同一个接口实现对应的功能。因为STL的算法和容器是分离的,两者通过迭代器链接。算法的实现并不知道自己被传进来什么。萃取器相当于在接口和实现之间加一层封装,来隐藏一些细节并协助调用合适的方法,这需要一些技巧(例如,偏特化)。最后附带一个小小的例子,应该能更好地理解 特性萃取。下面大部分来源于《STL源码剖析》转载 2018-01-22 21:51:28 · 1182 阅读 · 0 评论 -
C++ 学习笔记:typename
“typename”是一个C++程序设计语言中的关键字。当用于泛型编程时是另一术语”class”的同义词。这个关键字用于指出模板声明(或定义)中的非独立名称(dependent names)是类型名,而非变量名。class关键字的同义词这是一项C++编程语言的泛型编程(或模板编程)的功能,typename关键字用于引入一个模板参数,例如 // 定义一个返回参数中较大者的通用函数原创 2018-01-24 19:34:40 · 275 阅读 · 0 评论 -
C++ 学习笔记:typeid详解
typeid关键字注意:typeid是操作符,不是函数。这点与sizeof类似)运行时获知变量类型名称,可以使用 typeid(变量).name()需要注意不是所有编译器都输出”int”、”float”等之类的名称,对于这类的编译器可以这样使用int ia = 3;if(typeid(ia) == typeid(int)){ cout <<"int"...转载 2018-01-24 19:21:45 · 750 阅读 · 0 评论 -
C++学习笔记04
1:C++ SegmentFalut 错误 计算机是段页式存储管理方式管理,首先是段地址,然后是页地址,最后是偏移量,然后把虚拟地址转换为物理地址。SegmentFalut就是使用虚拟地址找不到合法的物理地址,通常都是因为指针使用使用错乱导致的。指针使用错乱导致虚拟地址找不到合法的物理地址(找不到或者找到了其他进程的地址),Linux会保护进程,所以操作系统的做法就是直接返回,报Segment ...原创 2017-09-04 21:45:46 · 243 阅读 · 0 评论 -
C++ 学习笔记:原生指针 && 泛型指针 && 智能指针
原生指针就是最普通的指针,定义类似: 类型 *变量名;与之对比的是使用上有类似指针的功能 实际并不是指针。比如:迭代器。一个类重载 *和->操作符 那么可以像指针一样使用 但是这种并不是原生的。泛型指针第一种就是 void *指针 可以指向任意的数据结构 因此可以称为”泛型”。 第二种就是指具有指针特性的泛型数据结构 如:泛型迭代器和接下来要说的智能指针。智能指针C原创 2018-01-23 18:10:45 · 1230 阅读 · 0 评论 -
C++ STL源码解析:空间配置器allocator分析
stl六大组件简介我们知道,stl有容器,空间配置器,适配器,迭代器,仿函数以及算法这6个组件,它们六者关系大概如下:容器通过配置器取得数据存储空间,算法通过迭代器获取容器内容,仿函数可以协助算法完成不同的策略变化,配接器可以修饰或套界仿函数。因此我们需要先去学习空间配置器。一般来说,我们习惯的C++内存配置和释放操作是这样的:class A {};A* pa = new A原创 2018-01-21 20:07:44 · 668 阅读 · 0 评论 -
C++ 学习笔记:typename
“typename”是一个C++程序设计语言中的关键字。当用于泛型编程时是另一术语”class”的同义词。这个关键字用于指出模板声明(或定义)中的非独立名称(dependent names)是类型名,而非变量名。class关键字的同义词这是一项C++编程语言的泛型编程(或模板编程)的功能,typename关键字用于引入一个模板参数,例如 // 定义一个返回参数中较大者的通用函数原创 2018-01-23 19:40:55 · 260 阅读 · 0 评论 -
C++ 学习杂谈:sizeof(string)到底是多少?
sizeof(string) 到底是多少呢?关于sizeof(string),在书上写着sizeof(string)=4;当时很纳闷,难道分配4个字节大小的内存给string吗?查阅了相关资料得出结论:string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()原创 2018-01-22 21:02:44 · 8020 阅读 · 0 评论 -
C++学习笔记02
1,预处理:原创 2017-09-04 18:39:16 · 242 阅读 · 0 评论 -
C++ Primer 学习笔记:标准库定义的函数对象
标准库定义了一组表示算数运算符、关系运算符和逻辑运算符的类,每个类分别定义了一个执行命名操作的调用运算符。目前想到的使用场景是把这些类定义作为回调函数使用,我们就不必自己去实现,这些函数很方便,比如vector排序,vector<int> vec{3,5,7,8,9,43}; sort(vec.begin(), vec.end(), greater_equal<int>()); 有下面这些:p原创 2018-01-03 18:16:57 · 467 阅读 · 0 评论 -
C++ Primer 学习笔记:关联容器入门 set && map
关联容器标准库提供8个关联容器,这8个容器间的不同体现在三个维度上:每个容器 (1)或者是一个set,或者是一个map; (2)或者要求不重复的关键字,或者允许重复关键字; (3)按顺序保存元素,或无序保存。 允许重复关键字的容器的名字中都包含单词multi; 不保持关键字按顺序存储的容器的名字都以单词unordered开头。类型map和multimap定义在头文件map中;se原创 2018-01-02 17:46:13 · 524 阅读 · 0 评论 -
C++ Primer 学习笔记:指针数组 VS 数组指针
指针数组: array of pointers,即用于存储指针的数组,也就是数组元素都是指针数组指针: a pointer to an array,即指向数组的指针还要注意的是他们用法的区别,下面举例说明。int* a[4] 指针数组 表示:数组a中的元素都为int型指针 元素表示:a[i] (a[i])是一样的,因为[]优先级高于*int (*a)[4] 数组...原创 2017-12-31 13:28:43 · 231 阅读 · 0 评论 -
C++ Primer 学习笔记:cctype 的相关函数
本篇主要是介绍#include 的函数c++中应该是#include c中应该是#include 以下为字符函数库中常用的函数:函数名称 返回值isalnum() 如果参数是字母数字,即字母或数字,该函数返回trueisalpha() 如果参数是字母,该函数返回真isblank() 如果参数是空格或水平制表符,该函数返回trueiscntrl()原创 2017-12-31 10:52:55 · 247 阅读 · 0 评论 -
C++ Primer 学习笔记:emplace函数
emplace操作是C++11新特性,新引入的的三个成员emlace_front、empace 和 emplace_back,这些操作构造而不是拷贝元素到容器中,这些操作分别对应push_front、insert 和push_back,允许我们将元素放在容器头部、一个指定的位置和容器尾部。两者的区别 当调用insert时,我们将元素类型的对象传递给insert,元素的对象被拷贝到容器中,而原创 2018-01-01 16:09:37 · 3865 阅读 · 0 评论 -
为什么用成员初始化列表会快一些?
首先把数据成员按类型分类 1。内置数据类型,复合类型(指针,引用) 2。用户定义类型(类类型)分情况说明: 对于类型1,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的 对于类型2,结果上相同,但是性能上存在很大的差别因为类类型的数据成员对象在进入函数体是已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,这是调用一个构造函数,在进入函数体之后,进行的是 对已经...原创 2018-09-10 15:27:54 · 3836 阅读 · 0 评论 -
C++ 自定义二元谓词函数的写法
写的方法struct cmp { bool operator()(pair&amp;amp;lt;int, int&amp;amp;gt;&amp;amp;amp; a, pair&amp;amp;lt;int, int&amp;amp;gt;&amp;amp;amp; b) { if (a.first == b.first) return a.sec原创 2018-09-08 15:15:25 · 1843 阅读 · 0 评论 -
虚基类调用顺序 + 不能继承的类
https://blog.csdn.net/owen7500/article/details/52432970 https://www.cnblogs.com/haoyuanyuan/archive/2013/04/25/3041250.html原创 2018-09-05 13:36:24 · 1105 阅读 · 0 评论 -
一般递归与尾递归
参考这个博客一般递归与尾递归原创 2018-08-15 14:15:07 · 335 阅读 · 0 评论 -
LeetCode上一道经典的面试题-O(1)实现LRU Cache
参考这个博客这里写链接内容 思路: 每次数据项被查询到时,都将此数据项移动到链表头部(O(1)的时间复杂度) 这样,在进行过多次查找操作后,最近被使用过的内容就向链表的头移动,而没有被使用的内容就向链表的后面移动。 当需要替换时,链表最后的位置就是最近最少被使用的数据项,我们只需要将最新的数据项放在链表头部,当Cache满时,淘汰链表最后的位置就是了。 还有这个博客简单的LRU Ca...原创 2018-08-09 15:42:12 · 762 阅读 · 0 评论 -
0交换排序
长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换,完成以下函数#include &lt;iostream&gt;#include &lt;vector&gt;#include &lt;map&gt;#include &lt;unordered_map&gt;#include &lt;set&gt;#include &a原创 2018-07-01 18:52:46 · 1807 阅读 · 0 评论 -
C++ 虚函数表指针以及虚函数指针的确定
【摘要】很多教材上都有介绍到虚指针、虚函数与虚函数表,有的说类对象共享一个虚函数表,有的说,一个类对象拥有一个虚函数表;还有的说,无论用户声明了多少个类对象,但是,这个VTABLE虚函数表只有一个;也有的在说,每个具有虚函数的类的对象里面都有一个VPTR虚函数指针,这个指针指向VTABLE的首地址,每个类的对象都有这么一种指针。今天,我们就来解决这个问题,同一个类的不同对象,是不是拥有“相同”...原创 2018-06-14 14:30:05 · 2892 阅读 · 1 评论 -
this指针到底存放到哪里
那么C++中类成员函数是如何知道哪个对象调用了它?并正确显示调用它的对象的数据呢?当一个对象调用某成员函数时会隐式传入一个参数, 这个参数就是this指针。this指针中存放的就是这个对象的首地址。 这和C中通过向函数传递结构体变量的地址是不是很像?只是传参形式不一样罢了! 在C中我们是手工把结构体变量和函数关联起来的,而C++则是编译器帮我们把类数据和成员函数关联起来的并通过名称粉碎和编译...原创 2018-06-13 15:09:55 · 4531 阅读 · 0 评论 -
C++ 多态面试题
什么是多态?有哪些分类?答:多态是面向对象的重要特性之一,它是一种行为的封装,是同一种事物所表现出的多种形态,简单地说是”一个接口多种实现“ 有两种类型的多态性: 编译时的多态性。编译时的多态性是通过重载来实现的。 运行时的多态性。运行时的多态性是通过虚成员实现的。构造函数为什么不能是虚函数?1.从存储空间角度。 虚函数对应一个vtable,这个vtable其实是存储在对象的...原创 2018-03-11 21:12:01 · 2981 阅读 · 1 评论 -
当编程题没有AC的时候应该怎么办?
当在做编程题没有AC的时候,基本上出现80%的时候可能遇到了哪些问题呢?数据溢出这个分为两组情况,比如加法乘法、除法导致的int溢出,这个主意使用变量的类型,这个属于极大值的情况还有极小值的情况,比如C++的size()函数返回的是无符号数字,这个时候a.size()-1就会出错,这个情况也要注意特殊case的考虑这个就是一些极端case忽略了,这个时候可能需要特殊处理...原创 2018-03-03 11:18:13 · 1909 阅读 · 0 评论 -
2018阿里巴巴客户端研发工程师面试记录
内推首先通过师兄内推,然后到官网上填写简历,阿里果然是Java系,师兄专门问了我愿不愿意做Java开发,我当说愿意啦。官网上填写完成简历之后,系统就立即发过来素质测评和编程测试的通知邮件,没有提示结束时间,估计就是尽早做完就可以了吧。素质测评素质测试不是计算机基础知识的测试,是属于对个人性格等等的测试,分成好几个部分,前面有的题是限时的,比如60s等等。编程测试编程...原创 2018-03-03 11:06:14 · 3323 阅读 · 0 评论 -
C++ 随手笔记
C++成员变量初始化顺序成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。因为成员变量的初始化次序是根据变量在内存中次序有关,而内存中的排列顺序早在编译期就根据变量的定义次序决定了。这点在EffectiveC++中有详细介绍。如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。注意:类成员在定义时,是不...原创 2018-03-10 14:56:48 · 224 阅读 · 0 评论 -
有36匹马6个跑道,用最少比赛次数算出跑最快的前3匹马
36匹马分6个组,分别为A、B、C、D、E、F组. 第一轮,每个组各跑一次,取每组前三名,标识为A1、A2、A3,B1、B2、B3,以此类推.第二轮,每个组的第一名(A1——F1)拉出来跑一次,假设名次是:A1第一名,B1第二名,C1第三名. 则:1.后三名及其所在组的其余组员均被淘汰(小组头名都没能进前三,当然是全部淘汰啦) 2.两战全胜的A1已经提前夺冠了. 3.由于A1已经...原创 2018-03-02 15:21:39 · 4532 阅读 · 0 评论 -
找出数组中出现次数超过一半的数+ 寻找众数 + 摩尔投票法
排序就是先做排序,然后找中位数map统计直接使用map统计出现次数,然后遍历map即可缩小范围每次取出两个不同的数,剩下的数字中重复出现的数字肯定比其他数字多,将规模缩小化。如果每次删除两个不同的数(不管包括不包括最高频数),那么在剩余的数字里,原最高频数出现的频率一样超过了50%,不断重复这个过程,最后剩下的将全是同样的数字,即最高频数。此算法避免了排序,时间复杂度只...原创 2018-03-02 15:04:25 · 832 阅读 · 0 评论 -
C++学习笔记10 各种各样的排序算法复杂度
各种排序的复杂度C++中的qsort()采用的是快排算法,C++的sort()则是改进的快排算法。两者的时间复杂度都是nlogn,但是实际应用中,sort()一般要快些,建议使用sort()。插入排序、冒泡排序、归并排序和基数排序是稳定的,其余的比如希尔排序、选择排序、堆排序、快速排序都是不稳定的。插入排序 (Insertion Sort): 插入排序的基本思想是,经过i-...原创 2017-09-06 10:59:34 · 494 阅读 · 0 评论 -
C++ Primer 学习笔记:数字 && 字符串转换
数字——>字符串这个很简单,可以直接使用stringstream来做转换,但是有点麻烦,直接使用to_string()函数更加方便个人推荐使用to_string()函数字符串——>字符可以直接使用stringstream做转换,但是有的时候只需要一次转换,这个时候就可以直接使用下面的几个函数了下面几个函数是C++11标准新添加的,很方便使用stoi(); strin原创 2018-01-01 16:41:32 · 296 阅读 · 0 评论 -
C++ Primer 学习笔记:泛型算法入门 特定容器算法
与其他的容器不一样,链表类型的list和forward_list定义了几个成员函数形式的算法,这些函数和前面的所总结的通用算法不同,对于list来说,最好使用自己的特有算法,下面介绍一下主要的几个算法,这些算法的返回值都是void:其中lst和lst2都是链表结构:lst.merge(lst2) : 将来自lst2的元素合并到lst。lst和lst2都必须是有序的。lst.merge(lst2,原创 2018-01-02 12:21:34 · 270 阅读 · 0 评论 -
C++ Primer 学习笔记:泛型算法入门 插入迭代器 && iostream迭代器 && 反向迭代器
插入迭代器插入迭代器(Insert Iterator),又叫插入器(Inserter),是继上次的反向迭代器之后C++中的又一个迭代器适配器。插入迭代器的主要功能为把一个赋值操作转换为把相应的值插入容器的操作。插入迭代器对标准算法库而言尤其重要。算法库对所有在容器上的操作有个承诺:决不修改容器的大小(不插入、不删除)。有了插入迭代器,既使得算法库可以通过迭代器对容器插入新的元素,又不违反这一承...原创 2018-01-02 10:48:26 · 357 阅读 · 0 评论 -
C++ Primer 学习笔记:泛型算法入门 参数绑定bind
bind函数的基本介绍bind函数的最根本的作用就是可以把一个参数较多的函数给封装成参数较少的函数,因此对于上述find_if函数的问题,我们可以自定义一个含俩个参数的函数,然后通过bind函数进行封装,使之变成含一个参数的新函数(新函数会调用原来的函数),这样新函数就可以被find_if函数的第三个参数所使用了,bind位于头文件functional之内bind的基本形式与使用bind函数定义在头原创 2018-01-02 10:24:09 · 575 阅读 · 0 评论 -
C++学习笔记16
C++ 位域C++的位域的出发点是从为了节约内存出发的,一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。如下: 小端:就是人阅读的逆序(内存递增方向)(Win10是小端) 大端:人阅读的顺序(相对于内存递增方向)在win10下:给b赋值100(0110 0100),那么由于win1原创 2017-09-15 14:13:39 · 205 阅读 · 0 评论 -
C++学习笔记17
1,构造函数初始化列表异常处理。 为了处理构造函数成员初始化列表产生的异常,必须将构造函数编写为函数测试块(function try block)。关键字try出现在成员初始化列表之前,测试块的复合语句包围了构造函数的函数体。catch子句既可以处理从成员初始化列表中抛出的异常,也可以处理从构造函数函数体中抛出的异常。析构函数应该从不抛出异常,因为析构函数都是自动调用的,不会自动加上原创 2017-09-15 14:29:15 · 247 阅读 · 0 评论