随笔分类 -  C++

1
摘要:首先要知道 stl 的算法是什么? 算法(Algorithm)是 function template,Algorithm 看不见容器(Containers),所以要从 iterator 取信息,iterator 必须回答 Algorithm 的问题来进行操作 iterator 的 iterator_ 阅读全文
posted @ 2023-03-20 23:41 acwarming 阅读(84) 评论(0) 推荐(0)
摘要:hashtable 一般使用的是链表法,以 G2.9 版本为例,buckets 大小从 53 开始,当总元素大于 buckets 时,选大概 2 倍的质数扩充 hashtable 有 6 个模板参数:value、key、hashfcn、extractkey、equalkey hashfcn:哈希函数 阅读全文
posted @ 2023-03-15 22:35 acwarming 阅读(44) 评论(0) 推荐(0)
摘要:set set、multiset是以红黑树为底层的,所以有自动排序的功能,有iterator可以遍历,但无法改变元素值,multiset的key可以重复 无法改值是因为 iterator 是 const,实际操作都是红黑树对象在做 map map、multimap一样是以红黑树为底层,有自动排序(对 阅读全文
posted @ 2023-03-15 15:40 acwarming 阅读(23) 评论(0) 推荐(0)
摘要:deque deque 有个以 vector 组成的控制中心 map ,意味这它会自动扩充,每个 vector 元素指向一个 buffer缓冲区,这个控制中心有 start 和 finish iterator分别有 node 指向第一个 buffer 和 最后一个,每个 buffer 也有 iter 阅读全文
posted @ 2023-03-12 22:04 acwarming 阅读(53) 评论(0) 推荐(0)
摘要:##对vector的理解 vector就是可以扩充的array,它有三个指针:start、finish、end_of_storage,分别代表 vector 存放了数据的开始、结束和整个容量的尾巴,它扩充的时候也不是原地就扩充(一般是2倍扩充),而是会找新的满足扩充后容量的空间,如果没有容量能满足那 阅读全文
posted @ 2023-03-12 17:17 acwarming 阅读(42) 评论(0) 推荐(0)
摘要:##iterator需要遵循的原则 iterator是算法和容器的桥梁,算法要知道要处理的容器范围,算法在操作的时候,很可能要知道这个iterator有哪些性质来做最佳化的动作 iterator至少要回答3个问题: 1.iterator_category 2.different_type 3.val 阅读全文
posted @ 2023-02-27 20:37 acwarming 阅读(48) 评论(0) 推荐(0)
摘要:##list结构 ###内存大小 list里存放的数据就一个node,为link_node类型,最终是个指针,为4字节,所以list的sizeof为4 我们可以看到__list_node结构体,它是双向链表(记得要前闭后开,所以要在最后留一空白节点),里面存放数据data,但是可以看到它前后指针类型 阅读全文
posted @ 2023-02-24 10:10 acwarming 阅读(58) 评论(0) 推荐(0)
摘要:##先谈operator new()和malloc() c++分配内存动作最终都会跑到malloc上,所以operator new里也是调用malloc 那malloc分配内存什么样子呢?如下图所示 蓝色块是实际大小,上下2个红色是cookie,作分界用,整个内存大小会调整到某个边界,所以有绿色的( 阅读全文
posted @ 2023-02-23 19:42 acwarming 阅读(48) 评论(0) 推荐(0)
摘要:#有哪六大部件? 容器(containers)、分配器(allocators)、算法(algorithm)、迭代器(iterator)、适配器(adapters)、仿函数(functors) #这些部件分别是干啥的? ##1.容器 容器就是数据结构,里面有list链表、queue队列等 容器用来放/ 阅读全文
posted @ 2022-11-23 18:10 acwarming 阅读(78) 评论(0) 推荐(0)
摘要:1.当编译器看到一个函数调用,有2个考量:静态绑定or动态绑定 静态绑定是"call xxx",xxx 是表示地址,call 是汇编语言的一个动作,它一定会调用到某个地址; 当符合以下3个条件时会进行动态绑定: 1)是通过指针来调用 2)这个指针是向上转型的,就是这个指针 new 了一头猪,而声明的 阅读全文
posted @ 2022-05-16 20:50 acwarming 阅读(89) 评论(0) 推荐(0)
摘要:1.声明 reference 一定要有初值,指针可以不用设初值 2. int& r = x; 表示 r 代表 x, r 用起来就是 x ,而且 reference 设完初值后再也不能代表其他变量了; int* r = &x; 表示 r 指向 x 地址; 3.reference常见用途 referen 阅读全文
posted @ 2022-05-16 17:10 acwarming 阅读(188) 评论(0) 推荐(0)
摘要:1.variadic template(模板参数可变化) template... type就是说有可变模板参数,作为参数使用时类型就是 类型后 + ... ,例如type... / type& ... ,调用时用 名称... sizeof...()可以得到里面有几个参数 注意:template... 阅读全文
posted @ 2022-05-16 16:09 acwarming 阅读(77) 评论(0) 推荐(0)
摘要:1.成员模板 理解起来就是类是模板类,他里面的成员函数又是个模板函数 上图例子:用派生类构造父类 2.模板特化 就是在类模板泛化后写特化的类,在template<>里不绑定类型,而在类后面<绑定类型> 3.模板偏特化 1)绑定个数的偏 就是在泛化时有一小部分元素是固定的某种类型值,例如char,这样 阅读全文
posted @ 2022-05-14 17:18 acwarming 阅读(214) 评论(0) 推荐(0)
摘要:1.智能指针 智能指针里面包含其他指针的形式和 委托 感觉比较像; 智能指针一定都需要重载 * 和 -> 操作符 ; 这个符号它作用后还能再继续作用下去; 2.迭代器: 这里主要关注 * 和 -> 操作 这里 * 就是要取其值,使用返回指针的data; 注意: 从上图右边也能了解到什么时候使用 ". 阅读全文
posted @ 2022-05-11 20:32 acwarming 阅读(75) 评论(0) 推荐(0)
摘要:1.转换函数 转换函数不需要返回值和参数,直接 "operator 类型名称() {}" ,类型名称就决定了返回值; 在一开始在执行 d = 4 + f; 时,先看有木有重载 + ,发现没有再尝试找转换函数; 2.non-explicit-one-argumennt ctor 当构造函数前没expl 阅读全文
posted @ 2022-05-11 19:46 acwarming 阅读(76) 评论(0) 推荐(0)
摘要:1.对于非虚函数,是不希望派生类对该函数重新定义; 对于virtual函数,在父类已经有默认定义后,并希望子类重新定义它; 对于pure virtual函数,父类没有默认定义,派生类必须要重新定义它; 2.当有继承和复合下的构造和析构的运作: 1)当派生类里有复合的情况下,构造顺序会是什么样的呢? 阅读全文
posted @ 2022-05-06 18:36 acwarming 阅读(45) 评论(0) 推荐(0)
摘要:1.复合,表示has a template <typename T> calss A{ protected: B<T> c; } 这里表示 A 里面有一个 B,A 可以调用 B 写好了的功能函数,B 里的东西可能更多更强大,A 只取其中一些用; 复合关系下的构造和析构: 1)构造是由内而外进行的,在 阅读全文
posted @ 2022-05-04 22:33 acwarming 阅读(231) 评论(0) 推荐(0)
摘要:1.static数据 和 static函数: 对于 非static函数 在内存中只有一份,当类对象调用时,其实会有该对象的this pointer传进去,那个函数就知道要对那个对象进行操作; static 数据 和 static函数 在内存中也是只有一份,一般 static数据 使用是在该类所有对象 阅读全文
posted @ 2022-05-04 20:47 acwarming 阅读(57) 评论(0) 推荐(0)
摘要:1.stack 是存在与某个作用域的一块内存空间,当调用函数时,函数就会形成一个stack 存这它的一些参数、返回地址等,生闷气在函数执行完会自动消灭; 2.heap 是操作系统提供的全局的内存空间,是动态分配的(new),用完了需要手动delete,不然在作用域外还会占用内存,会造成内存泄漏; 3 阅读全文
posted @ 2022-05-03 16:41 acwarming 阅读(81) 评论(0) 推荐(0)
摘要:1.头文件中的防卫式声明 例如自己要建复数complex类,可以建立一个complex.h的头文件。 头文件中必须先写防卫式声明: #ifndef __COMPLEX__ #define __COMPLEX__ //此处为头文件的其他内容 //在2点会描述这个的布局 #endif 2.头文件布局 # 阅读全文
posted @ 2022-05-02 17:49 acwarming 阅读(131) 评论(0) 推荐(0)

1