C++
zedjay_
开心每一天~
展开
-
C++中lambda表达式
文章目录声明Lambda表达式捕获外部变量1、值捕获2、引用捕获3、隐式捕获4、混合方式修改捕获变量Lambda表达式的参数C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,"Lambda表达式"或"匿名函数"这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如Python等。...原创 2020-03-09 01:00:24 · 182 阅读 · 0 评论 -
柔性数组
柔性数组在日常的编程中,有时候需要在结构体中存放一个长度动态的字符串,一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该字符串所在的动态内存空间,例如:typedef struct test { int a; double b; char *p; };p指向字符串。这种方法造成字符串与结构体是分离的,不利于操作。如果把...原创 2020-03-08 11:25:37 · 184 阅读 · 0 评论 -
C++中普通函数指针与类成员函数指针的异同
文章目录函数指针(function pointer)普通函数指针成员函数指针(重点)函数指针(function pointer)与普通的指针一样,函数指针也是指针,但是不同的是函数指针指向的不是类型,而是函数地址。函数指针是通过指向函数的指针间接调用函数。相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生。普通函数指针通常我们所说的 函数指针 指的是指向...原创 2020-02-24 16:49:42 · 2107 阅读 · 0 评论 -
I/O的五种模型总结
文章目录I/O的五种模型总结1. 五种 I/O 模型一次I/O的完成的步骤5种I/O 过程图解阻塞I/O非阻塞I/OI/O复用事件(信号)驱动I/O异步I/O(asynchronous I/O)2. 区分总结I/O的五种模型总结1. 五种 I/O 模型阻塞I/O非阻塞I/OI/O复用事件(信号)驱动I/O异步I/O为什么要发起系统调用?因为进程想要获取磁盘中的数据,而能和硬件...原创 2020-02-23 14:50:13 · 373 阅读 · 0 评论 -
C++中mutable的用法和存在意义
1. mutable的主要用法:让类中的const函数能够修改类内值小例子:github2. mutable存在的意义有人会说,既然是在const函数中修改的,那我把函数中的const去掉不就可以了吗?还要mutable干什么?以下摘取一些知乎的回答:const意思是“这个函数不修改对象内部状态”。为了保证这一点,编译器也会主动替你检查,确保你没有修改对象成员变量——否则内部状态就变...原创 2020-02-17 18:13:21 · 2837 阅读 · 0 评论 -
C/C++面试题学习记录
本文主要参考:牛客网给的链接同时本人在此基础上加入个人理解和相关例子,若有不对,恳请指出。1. 语言基础1.1 值初始化问题默认初始化发生在下面的情形中:T obj; // 栈中的变量 new T; // 堆的定义一个变量但是没有给出初始值.用 new 创建一个对象, 但是没有给出初始值.(提供了括号就认为提供了初值)当父类或非静态数据成员没有出现在构造函数初始化列表...原创 2020-02-15 00:16:30 · 217 阅读 · 0 评论 -
C++11中有关右值引用的学习
文章目录1. 左值和右值的区别2. 左值引用和右值引用3. 引用的值类型和引用叠加3.1 值类型3.2 引用叠加4. 右值引用怎么用4.1 move语义5. 完美转发(to do)6. std::move7. 额外的例子8. 参考1. 左值和右值的区别左值和右值,最早是从 C 语言继承而来的。在 C 语言,或者继承版本的解释中,左值是可以位于赋值运算符 = 左侧的表达式(当然,左值也可以位...原创 2020-02-07 19:58:09 · 315 阅读 · 0 评论 -
使用Varglind检查C++内存泄露(转)
啥都不说,直接上大神写的博客链接转载 2020-02-06 21:40:06 · 1766 阅读 · 1 评论 -
类内值初始化问题
0. 前言昨晚写一个单向链表的代码, 目的是新建几个节点, 然后串联起来, 代码如下:class ListNode{public: ListNode(int v):val(v){} int val; ListNode *next; static void print_node_val (const ListNode* p_node){ wh...原创 2019-12-16 11:58:48 · 576 阅读 · 0 评论 -
Factory Method 工厂方法
1. 需要解决的问题代码1 : FileSplitter1.cppclass ISplitter{ //抽象基类public: virtual void split() = 0; virtual ~ISplitter() {}};class BinarySplitter : public ISplitter{};class TxtSplitter : publ...原创 2019-12-05 16:45:31 · 96 阅读 · 0 评论 -
装饰模式
1. 模式动机一般有两种方式可以实现给一个类或对象增加行为:继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(Decorator...原创 2019-12-05 11:19:12 · 162 阅读 · 0 评论 -
策略模式
1. 模式定义策略模式(Strategy Pattern): 定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。如下图, 用Context把算法聚合起来2. 例子类图用CashContext把算法抽象起来.代码/* * @Author: sanjayzhong * @Github: ht...原创 2019-12-04 16:12:18 · 82 阅读 · 0 评论 -
设计模式类图
1. "组件协作"模式1.1 Template method模式1.2 策略模式1.3 观察者模式2. "单一职责"模式2.1 Decorator 模式2.2 bridge 桥模式原创 2019-12-03 22:16:20 · 120 阅读 · 0 评论 -
C++11新特性
1. variadic template可变参数模板#include <iostream>#include <bitset>using namespace std;void print(){}template<typename T, typename... Types>void print(const T& firstArg, con...原创 2019-12-02 21:40:43 · 87 阅读 · 0 评论 -
C++分配内存的途径
文章目录1. C++非容器分配内存的途径2. C++容器类分配内存的途径3. 重载全局operator new和operator delete4. 重载类内operator new/ operator delete(包括[])4.1 要点4.2 测试例子1. C++非容器分配内存的途径如下图所示, 当我们使用如下语句:Foo* p = new Foo(x);的时候, 默认走的是2的路径, ...原创 2019-11-29 12:47:57 · 215 阅读 · 0 评论 -
C++中的内存调用
1. C++使用内存的途径通过c++标准库调用: 如std::allocator通过c++基础语法调用: 如new, new[], ::operator new()通过malloc/free调用(这里面其实是c的语法)通过操作系统提供的API进行调用2. C++内存管理的基础主要学习下面四种操作:需要注意的是::operator new()是c++函数, 因此可以重载.使用...原创 2019-11-28 19:50:15 · 755 阅读 · 0 评论 -
type traits浅析
1. G2.9的type traitG2.9的type trait用一个泛化类模板来定义各种类型的属性, 默认都是假的然后给每一种类型都添加了偏特化版本, 这样的缺点是每写一个类, 都要添加一个偏特化的模板类, 十分麻烦2. C++改进的type traits自从C++11之后, 添加了很多种type traits, 如下:我们可以写一个例子测试一下:#include <i...原创 2019-11-28 14:53:46 · 645 阅读 · 0 评论 -
C++中的元组(tuple)[待完善]
1. 元组的设计元组有一个泛化的模板, 也有两个特化模板, 如左下图:比如tuple<int, float, string>, 这时候符合的模板是第三个, 于是调用构造函数, 把int m_head = 4 记录, 接着去寻找符合的模板, 发现又是调用自己, 接着把float类型及参数保存起来, 然后继续调用自己, 把string保存起来, 这时候已经没有参数了, 于是调用clas...原创 2019-11-28 14:22:19 · 150 阅读 · 0 评论 -
迭代器适配器和x适配器
1. 迭代器适配器1.1 reverse_iterator 反向迭代器适配器这个迭代器适配的作用是将迭代器逆转.如rbegin()和rend()就是调用这个适配器, 如下图:本来begin()迭代器++之后是往右边走的, 然后*运算符取的是迭代器右边的元素;当使用rbegin()之后, rbegin()指向的地方和end()一样, ++是从右往左走, *运算符取的是迭代器左边的元素.怎...原创 2019-11-28 13:52:01 · 168 阅读 · 0 评论 -
C++中的仿函数(functors)和仿函数适配器(adapter function)
1. C++标准库中的仿函数例子比如下面的plus类, 重载了()运算符, 可以这样子用plus p; p(1, 2);, 类可以像调用函数一样的行为, 被称为仿函数.再看看多几个例子:然后我们自己写一个仿函数, 然后用sort调用试试:struct myclass{ bool operator()(int i, int j) { return i < j; }} ...原创 2019-11-27 17:20:27 · 465 阅读 · 0 评论 -
算法与容器联系的纽带:迭代器(Iterator)
1. 算法与容器之间的关系算法看不见容器, 对其一无所知, 因此它需要的信息都必须从iterator中获取;所以iterator必须能够回答algorithm的所有提问, 才能把容器和算法联系起来.2. iterator的种类iterator的种类一共有5种, 分别是:input_iterator_tagoutput_iterator_tagforward_iterator_ta...原创 2019-11-25 17:38:18 · 479 阅读 · 0 评论 -
红黑树与set, map
1. set和map的底层结构: 红黑树(rb_tree)需要注意的是, 红黑树的结构是允许我们用iterator改变元素值的, 但是不应该这么做, 因为红黑树会自动排序, 如果我们改变值, 就会破坏红黑树的结构. 后面会看到, set和map把这种自由度给限制了.下面是GNU2.9的rb_tree代码, 可以看到, 模板需要传入key, value, keyofvalue, compare...原创 2019-11-23 14:49:27 · 493 阅读 · 0 评论 -
stack和queue底层容器替换探究
文章目录1. stack和queue的底层容器都是deque2. 替换底层容器可以吗?2. 1 用list替换2.2 用vector替换2.2.1 stack可以用vector替换2.2.2 queue不可以2.3 用set或者map作为底层结构1. stack和queue的底层容器都是deque注意:由于stack的规则是先进后出, queue的规则是先进先出, 为了满足这种规则, 这...原创 2019-11-22 20:38:59 · 572 阅读 · 0 评论 -
list和iterator
文章目录1. 容器之间的复合关系(composition)2. list源码探究3. Iterator设计原则1. 容器之间的复合关系(composition)如下图:arrayvectorheappriority_queuelistslist(标准库改为forward_list了)dequestackqueue关联性容器先不说了. 注意到这是2....原创 2019-11-22 13:14:31 · 398 阅读 · 0 评论 -
更好但标准库却不采用的alloc内存分配
现在标准库中容器分配的默认类都是template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc>...中的allocator类, 这样的类里面分配的内存空间每一个元素都要额外分配内存记录分...原创 2019-11-21 16:39:49 · 272 阅读 · 0 评论 -
为什么list不能使标准库算法sort()?
list的内存空间不是连续的标准库算法中的操作需要随机访问迭代器原创 2019-11-21 13:22:20 · 900 阅读 · 0 评论 -
CPP类中的const
代码:int main(int argc, char *argv[]){ string str = "hello"; str[0] = '0'; //只能调用string中的非const[]重载 cout << str << endl; const string const_str = "hello"; cout &...原创 2019-11-16 14:00:39 · 297 阅读 · 0 评论 -
C++对象模型(Object Model)--关于vptr(虚函数指针)和vtbl(虚函数表)
子类继承父类, 父类的变量被子类继承, 也就是在内存上子类继承父类的变量子类继承父类, 父类的函数被子类继承, 不是继承父类函数的内存大小, 而是继承父类函数的调用权假设A是父类, B是继承于A的子类如果A有虚函数, B会继承A的函数的调用权, 因此B不可能没有虚函数, 因此, 如果父类有虚函数, 那么子类一定有虚函数例子:在上图的左下角, 有个p, 这个p是这样来的C* ...原创 2019-11-16 13:00:26 · 258 阅读 · 0 评论 -
reference引用假象
1. 引用假象之前知道引用是用指针实现的, 但是没想到它的大小和地址竟然是和本地一样的!这都是编译器造成的假象看代码:int main(int argc, char *argv[]){ int x = 0; int* p = &x; // int& r = x; //r 代表x, 现在r, x都是0 cout <<...原创 2019-11-15 22:15:25 · 104 阅读 · 0 评论 -
C++11新特性
1. auto2. for我不懂的是在for(int i : { 2,3,3,4,5,6}){ cout << i << endl;}中的{ 2,3,3,4,5,6}是什么类型, 类似python, 在python中是set类型, 但是在cpp中不知道是什么类型, 这个保持疑问…在cpp中, 可以用typeid(a).name()来查看变量a的类型...原创 2019-11-15 21:22:04 · 73 阅读 · 0 评论 -
数量不定的模板参数(variadic templates)
1. 数量不定的模板参数(variadic templates)先看图:这里的流程是:调用print(7.5, "hello", bitset<16>(377), 42);这里先调用模板函数, 也就是上图2中的函数, 这里第一次firstArg是7.5, 然后就输出7.5, 接着下面的语句:print(args...);这里递归调用print, 相当于:print("...原创 2019-11-15 20:32:03 · 650 阅读 · 1 评论 -
模板模板参数(template template parameter)
1. 模板模板参数(template template parameter)就是模板中还有模板.如下图,template<typename T, template <typename T> class Container >模板中含有一个template T, 然后 还有包含一个模板类, 模板类中的参数是用第...原创 2019-11-15 17:50:45 · 5573 阅读 · 2 评论 -
成员模版(member template), 模板特化(specialization), 模板偏特化(partial specialization)
1. 成员模版(member template)成员模板是指类模板中又包含了模板, 如下图黄色那里那这样有什么用呢? 看下图首先, 我们有两个基类Base1和Base2, 然后Derived1继承于Base1, Derived2继承于Base2, 然后我们定义一个pair类, 用Derived1和Derived2进行实例化, 然后用pair<Base1, Base2>来装, ...原创 2019-11-15 11:55:43 · 378 阅读 · 0 评论 -
Pointer-like classes, function-like classes
1. Pointer-like classes像是指针的类, 无论如何, 这个类一定会重载*和->运算符.这种类的用法用在智能指针.例子一:例子二: 容器中迭代器下图是容器迭代器的源码, 可以看到类__list_iterator重载了*和->运算符右上角是管理容器的节点, 有前节点指针prev和下节点指针next, 以及节点内容data这里详细分析这两个重载的意义, ...原创 2019-11-15 11:20:14 · 142 阅读 · 0 评论 -
关于类的转换
1. 转换函数(Conversion function)把类转换为基本数据类型的方法#include <iostream>using namespace std;class Fraction{public: Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den){} ...原创 2019-11-14 15:43:59 · 246 阅读 · 0 评论 -
C++中继承和虚函数
1. 带虚函数的继承(Inheritance with virtual function)从显示中理解, 我们要打开一个文档, 然后选择文档名称, 系统就会从硬盘中搜索文档, 找到文档之后打开文档, 但是打开文档的方式只有对应的文档知道. 如下图:这样的话, 一系列流程就确定下来了, 这些繁琐的流程都是一样的, 关键在于我们怎么实现打开对应文档的算法, 于是我们就可以把这一系列流程确定下来,...原创 2019-11-14 11:31:33 · 126 阅读 · 0 评论 -
CPP中类之间的关系
1. 组合(Composition)组合关系表示has-a.如STL中的queue和deque就是组合关系:template <class T>class queue{ ...protected: deque<T> c; //双向队列public: //以下完全利用c的操作函数完成 bool empty() const { re...原创 2019-11-13 20:21:29 · 242 阅读 · 0 评论 -
function_object
函数对象 function object函数对象是一个广泛的概念,因为所有具有函数行为的对象都可以称为函数对象。这是一个高级抽象,我们不关心对象到底是什么,只要其具有函数行为。所谓的函数行为是指的是可以使用()调用并传递参数:function(arg1, arg2, ...); //函数调用这种函数对象实际上是一个类的实例,只不过这个类实现了函数调用符():class X{public...原创 2019-11-02 21:19:39 · 693 阅读 · 0 评论 -
学习CPP看过的博客
结构体类型的变量名并不能直接当作地址使用,这一点和基本数据类型相同原创 2019-10-28 10:04:55 · 111 阅读 · 0 评论 -
C和CPP中头文件的作用
文章目录1. 头文件的由来2. C/C++的编译过程3. C++的编译方式4. 头文件里应该放什么5. 头文件中的保护措施1. 头文件的由来这里转载自知乎: 为什么C/C++要分为头文件和源文件? - wzsayiie的回答 - 知乎 https://www.zhihu.com/question/280665935/answer/649503865上世纪70年代初,C语言初始版本被设计出...原创 2019-10-21 11:15:56 · 1026 阅读 · 0 评论