随笔分类 - C++
摘要:Base类中加入虚函数: 和之前一样,但如果将p指向q(基类指针指向派生类对象): 其中*p就变成了派生类对象类型。
阅读全文
摘要:看C++primer,学习了,看起来还挺有用的。 pair大家都会,但局限性就是只能有两个成员。如果我们想做一个比较随意的、多成员的容器类型,就需要tuple了: int main(){ tuple<int,int,int> p={1,2,3}; p=make_tuple(4,2,56); //对应
阅读全文
摘要:可变参数模板函数写法: 模板参数里写typename... args,表明args是一个可变参数。 之后再函数参数里args后面也要加...,以表示该参数为可变参数。 函数参数中对于args的修饰,会扩展到所有该args的参数,比如下面代码: //可变参数模板函数使用方法1:递归调用,每次将可变参数
阅读全文
摘要:首先明确几个问题: 1.成员函数和友元函数、友元类的权限是一样一样一样一样的,是最高的权限,private、protected、public成员都可以随意访问。 2.用户代码(类外调用的其他代码)权限是最低的,只有类的public成员才能访问(不考虑静态成员),protected、private都无
阅读全文
摘要:重载:针对于普通函数。 要求函数名相同,形参列表不同,返回值无所谓。 注意不能仅仅通过返回值来区分重载函数。例子:void f(){} 和int f(){}这两个函数定义是错误的,不能同时定义这两个函数! 比如: void f(int x){} void f(double x){} 覆盖(重写):针
阅读全文
摘要:深信服笔试考了这个不会。查了下相关资料,记录一下。 a是某结构体类型 ((a*)0)是把一个为0的int变量强转为a*类型 ((a*)0)->b是取该指针的成员b &((a*)0)->b是取成员b的地址 (int)&((a*)0)->b)是将b的地址强转为int。因为之前该指针是强转0来的,所以结构
阅读全文
摘要:迭代器失效问题一般是指对于stl容器来说,调用erase某迭代器之后,就不能再使用这个iterator了。 解决方法: (1):erase(iter++);这样可以继续使用该iter (2):it=erase(iter);这是利用erase函数的返回值,一般的erase函数都会返回一个删除迭代器的后
阅读全文
摘要:const int x1=0;//常量写法1 int const x2=0;//常量写法2 int x3=0; int * const p1=&x3;//指针常量(指针类型的常量,对象是指针类型的,指针本身是常量,顶层const) const int* p2=&x1;//指向常量的指针(指针本身是变
阅读全文
摘要:学数据结构时就知道这个概念,一直没有研究过。 同样一个求阶乘的函数,首先是平时我们最熟悉的版本,也就是普通递归版本: 对于func(5)的递归调用如下: 然后是尾递归版本的: 调用图是这样的: 看起来,二者递归的栈都是五层嘛,有什么区别呢? 最大的区别是:对于第一种普通递归,每次函数的n*f(n-1
阅读全文
摘要:本文代码在VS2019测试通过,不代表其他编译器也能通过。(比如我的Vscode用的是Mingw编译器,就无法使用该代码) 文件信息结构体_finddata_t: _findfirst函数: 利用_findfirst找到第一个文件, 返回一个文件句柄,可以作为其他函数的参数。并将文件名匹配由 _fi
阅读全文
摘要:可以把非1的bool值按true输出,为0的bool值按false输出。 摘自官网: // modify boolalpha flag #include <iostream> // std::cout, std::boolalpha, std::noboolalpha int main () { b
阅读全文
摘要:Set、Map: 对于map、set来说如果是基本类型,默认从小到大。但如果是自定义类型或者非基本类型(比如vector这种),那么就需要自己重载相应的规则。 举例: 我知道的map重载从大到小的几种方法: 1、Lambda: auto cmp=[](int x,int y){return x>y;
阅读全文
摘要:代码很简单,如下: int add(int a,int b) { return a + b; } int main() { int x = add(3, 7); return 0; } main函数第一行设置断点,调试并查看反汇编。(注意先push 7,再push3,这里可以很好地佐证函数参数是从右
阅读全文
摘要:C语言的这种str函数如果有两个字符串参数,一个目的,一个源头。都是第一个为char*,第二个const char*的,前者为目的字符串地址,后者是只读的。 strcpy: 第二个字符串复制到第一个字符串 strncpy: 复制第二个字符串的前n个字符过去 strcat: 将第二个字符串拼接到第一个
阅读全文
摘要:用了这么久的sort,大概知道它是快排加一些其他排序组合起来的一个排序算法,今天就来捋清楚。 直接上图片: sort定义在stl_algo.h里,看起来只不过是对另一个函数的封装。 __sort函数也定义在stl_algo.h里: 可以看到它首先判断左右迭代器是否指代有效区间,如果不是有效区间就直接
阅读全文
摘要:学了这么久都不知道C语言有这个函数(其实是因为基本没写过C,除了学程序设计的时候。。) qsort 的函数原型是void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, c
阅读全文
摘要:首先我们都知道如果类里有虚函数(自己覆盖了/声明了新的虚函数或者继承了父类的虚函数都算),会在类的开头有一个虚函数表指针,所以一个空类如果有一个虚函数,那么sizeof该类等于4。 类的大小和内部数据有关系,和成员函数无关,函数都是放在代码段的,不包含在每个对象的实例中(要是每个实例里面都有一大堆函
阅读全文
摘要:头文件<regex> 先贴正则规则: 链接:https://www.cnblogs.com/hesse-summer/p/10875487.html \:\字符能够改变字符原本的含义 ^:^字符指示字符串的头,且要求字符串以字符开头,不占位。\^表示一个真正的^符号。 $:$字符指示字符串的尾,且要
阅读全文
摘要:make_heap:对一个容器建堆(默认最大堆!) 调用方法:make_heap(iter1,iter2,<cmp>); 其中cmp为小于规则,不加就是默认最大堆。 cmp一般使用lambda表达式,比如: make_heap(data.begin(),data.end(),[](const int
阅读全文
摘要:memcpy: void * memcpy ( void * destination, const void * source, size_t num ); 从source复制数据给dest,注意size_t是字节数,和类型无关。比如可以这样调用: int main() { int p[3] = {
阅读全文

浙公网安备 33010602011771号