STL
文章平均质量分 59
Zard 泉水
Get busy living, or get busy dying
展开
-
21 movable
movable 元素对vector 效率的影响vector 动态扩容 差距很大list 差距不大deque 是在前后扩充缓冲区,不需要拷贝元素r b_tree 差距不大hashtable : rehashing 扩容实现一个movable class左值,右值, 将亡值左值引用&,右值引用 &&Move 版本:指针,完成动作后指针指向nullptr析构函数 中要判断一下指针是否为空std::move()...原创 2021-07-22 00:22:02 · 104 阅读 · 0 评论 -
20 cout
cout 简介全局流对象gunc 2.9ostream & operator (ostream & os, const T& a){ ... return os; }原创 2021-07-20 22:46:20 · 82 阅读 · 0 评论 -
19 type traits
type traits 类型萃取gnuc 2.9 类型特性 默认情况下所有的东西都是重要的。在拷贝过程中要做构造和析构 如果知道这些类型不重要,可以写一个特化的版本出来。egtype 绑定为inttype 绑定为double更多的特化版本: complex 构造函数可以写,拷贝构造和拷贝赋值,析构函数不用写。这些性质都是由算法来问。算法根据这些性质进行一个高效的流程。缺点:使用时创建一个类需要加上这些特性。POD: plain old data c中的structGnuc 4原创 2021-07-20 22:44:22 · 76 阅读 · 0 评论 -
18 tuple
tuple, 用例 TR1 标准以后加入进来的,现在变成了标准库的一部分。指定任意类型。弹性很大。用法不同类型的tuple居然可以比较大小还可以使用 cout << v1tie 将tuple中的元素取出并赋值到传入tie的参数想要知道tuple的size tuple_size 编译器编译过程中去问,编译通过得到结果想要知道tuple中的元素 tuple_element源码解析variadic templates + 类的继承继承了部分的自己->减而治之h原创 2021-07-20 22:39:27 · 114 阅读 · 0 评论 -
17 一个hash function
hash function 问题:在使用hashtable为底层的容器时,必须要为其提供一个hashcode 数值类型本身的值就是hashcode 字符串的hashcode也有了#include <functional> class customer{ size_t customer_hash_func(const Customer &c) { return ... }}; // 函数对象struct cus原创 2021-07-19 22:21:38 · 72 阅读 · 0 评论 -
16 适配器
adapter 适配器迭代器适配器 与算法合作 迭代器的5 个typedef容器适配器 : stack, queue, map, set, multimap, multiset, unordered_set, unordered_multiset, unordered_map, unordered_multimap仿函数适配器 与算法合作设计模式:adapter适配器的实现a -> b继承方式 (不使用)组合方式 yes容器适配器容器适配器:stack, queue内原创 2021-07-19 22:18:46 · 97 阅读 · 0 评论 -
15 仿函数和函数对象
仿函数和函数对象 容易写一些小的组件融入到标准库中,作为辅助,functor只为了算法来服务仿函数 使用函数模版实现,使用时指定参数类型 identity. select1st, select2nd; 标准库提供的functor都有继承关系,我们自己写的都是单独的struct,没有继承表示没有融入STL的体系结构 在gnuc 4.9中名称发生了改变,用户代码要进行修改less<int>(); // 产生了一个临时的对象greater<int>(); /原创 2021-07-19 22:12:31 · 79 阅读 · 0 评论 -
14. 算法的示例
算法示例accumulateCallable item:functionfunction object operator()()lambada [](){}for_eachrange-based for statementfor(decl : coll){ statement; }replace头,尾,旧值, 新值带着if名称表示要给一个条件,参数是 头,尾,条件,新值 predicate 表示判断式 返回bool类型oldvalue 都以new原创 2021-07-19 01:12:04 · 116 阅读 · 0 评论 -
13.算法的性质
迭代器的分类 标准库中的算法都是函数模版算法的两个版本,第三个参数要传递一个准则,仿函数迭代器的分类5种迭代器的分类:有继承的关系输入迭代器输出迭代器双向迭代器随机访问迭代器输出迭代器打印容器迭代器的类型产生的是临时对象使用了模版函数 + 迭代器萃取 traits最后两个特殊的迭代器迭代器的typeidtypeid取决于编译器的实现typeid#include <typeinfo> cout << typeid(vec原创 2021-07-19 01:08:27 · 131 阅读 · 0 评论 -
12. 数据结构hashtable
容器hashtable散列表associated container.空间足够时,一对一映射实际上不会有这么大的空间。空间不足时,可能会发生两个或者多个不同的元素映射到一个槽bucket中。如何解决哈希冲突?一次函数转移到下一个位置二次函数转移到下一个位置次数越高,插入,查找的效率越低。工业界上使用的是开放地址法Separate Channing使用链表来处理哈希碰撞的情况当链表中的元素很多时,搜索的效率降低,这时需要将链表打散. rehashing增加原创 2021-07-19 01:02:56 · 130 阅读 · 0 评论 -
11.数据结构RBTree
RBTree 红黑树是一种适度平衡的二叉搜索树,排列规则有利于插入和查找,并且会自动保持平衡。没有任何分支过深。 是一种半线性结构,按照正常的遍历规则,得到的是排序状态(sorted) 不应该使用迭代器去修改元素的值,因为元素有着严谨的排列规则,编程层面上没有阻止。如此设计是正确的 基于红黑树的容器适配器set/multisetMap/multimap两种insertion操作,对应set/multiset, map/multimap容器RBTreekey和data原创 2021-07-16 23:31:44 · 108 阅读 · 1 评论 -
10.容器deque
deque - double-end-queue 内部分段连续,对外表现整体连续map是T*指针数组,map中维护指向buffer的指针,负责分段的控制尾端扩充,新分配一个buffer,串接到map末尾前端扩充,新分配一个buffer,串接到map前段、提供两个迭代器:start, finish迭代器:first 和 last 指出node对应buffer的头和尾cur 指出buffer中的位置,即当前元素位置node 如果走到了边界位置,先找到下一个node,转移到下一个buf原创 2021-07-16 23:26:43 · 71 阅读 · 0 评论 -
9.容器array
array为什么要封装成容器来使用:遵循容器的规则提供五种type_traits,让算法去询问相关的信息,便于算法操作Technical Report 1 版本: C++98 和 C++11之间的版本连续空间迭代器用指针实现即可,不用封装成pointer-like-classgnuc 2.9 也是如此类型萃取:T* 模版的偏特化gnuc 4.9forward list 自学 - -不提供operator–(), 所以不可能-end();...原创 2021-07-16 23:19:53 · 51 阅读 · 0 评论 -
8.容器vector
vector 动态扩容的数组:加倍策略 reallocationgnuc 2.9 维护三个指针,sizeof(vector) = 12 /24 ;startfinishEnd_of_storage实现动态扩容每次扩容都有大量的拷贝动作-> 拷贝构造函数和析构函数 insert_aux 函数还会被insert方法调用,插入动作也会导致扩容,所以有插入点前和插入点后的东西,要将插入点后面的元素也拷贝过来。 每次扩容都有大量的元素拷贝动作,并且原来的元素也要销毁掉。原创 2021-07-15 23:39:22 · 53 阅读 · 0 评论 -
7.容器 list
容器 List双向循环链表数据成员:nodenode 中 有两个void* 指针,一个T类型元素。源码中有很多的typedef,需要往前找到底是什么类型注意void* 应该在后面操作时转换为T*分配器使用的是 allociterator - smart pointer在链表的结束位置放置了一个哨兵节点:list.end();对迭代器++时应该指向链表的下一个节点,而不是单纯的指针++操作使用运算符重载(5个)来实现dereference成员访问运算符前置++原创 2021-07-15 23:30:44 · 63 阅读 · 0 评论 -
6.分配器allocator
分配器allocator 分配器是为容器分配内存的,效率相当重要空间利用率速度最重要的两个函数,内存的申请与回收allocatordeallocator1. Operator new() 和 malloc()operator new() 会调用 malloc();malloc分配的内存布局0x41 cookiepad 表示填充debug mode会有固定的调试信息内容具体的内容在c++内存管理中提到VC6 STL 对allocator 的使用 v原创 2021-07-15 23:24:33 · 111 阅读 · 0 评论 -
5.运算符重载与模版
运算符重载与模版1. 运算符重载https://en.cppreference.com/w/cpp/language/operatorsRestrictionsThe operators **::** (scope resolution), **.** (member access), **.\*** (member access through pointer to member), and **?:** (ternary conditional) cannot be overloaded.原创 2021-07-15 23:17:45 · 151 阅读 · 0 评论 -
4.体系结构与内核分析
STL源码分析 源码之前 了无秘密基础:c++ 基本语法模版基础:事半功倍数据结构与算法:如鱼得水标准库版本:Visual C++gnucOOP vs. GP(Generic Programming) STL 使用的是泛型编程思想,早期版本是没有虚函数的,很少有继承关系。OOP试图将对象和方法关联在一起GP 采用模版来设计标准库标准库的sort算法需要的迭代器需要支持随机访问。list 不支持随机访问,只能一步一步来。所以list不能使用全局的sort算法来进原创 2021-07-15 23:10:29 · 66 阅读 · 0 评论 -
STL使用分配器allocator
使用分配器allocatorSTL提供默认的分配器自己实现分配器容器中默认的分配器测试分配器 搭配不同分配器的写法直接调用allocate和deallocate脱离了容器,没有必要这么使用。要记住申请了多少内存,在归还时告诉deallocate。...原创 2021-07-14 23:28:43 · 144 阅读 · 3 评论 -
STL容器结构与分类
容器的结构与分类容器- 结构与分类序列式容器 sequencearray, c++11 不可扩容vector 向后扩容deque double-end queue 双端队列,前后均可扩充list 双向环状链表forward list, c++11 单向链表关联式容器- associative : key-value ,大量的查找动作 底层是rb-tree 高度平衡BSTset/multiset :value和key是一个东西multi 表示set里面的元素可以重复ma原创 2021-07-14 23:22:00 · 89 阅读 · 0 评论 -
STL6大组件
STL 6 大组件6 大组件以及之间的关系容器 containers: 存放元素的容器分配器 allocators :为容器分配内存算法 algorithms : 通过迭代器来操作容器中的元素迭代器 iterators :泛化的指针,pointer-like-class ,类似C中的指针适配器 adapters :对容器,仿函数,迭代器做转换仿函数 functors : C++中使用函数对象,c中使用函数指针eg 1. application#include <vector>原创 2021-07-14 23:07:03 · 142 阅读 · 0 评论 -
iterator_triats 如何识别STL容器中迭代器特性
实现iterator_triats 并识别STL容器中迭代器特性 最近在研究STL中迭代器的实现,并编写了自己的iterator_triats,在测试中发现,除了原生指针T*版本和 const T*版本可以很好的提取triats之外,对于STL中容器的迭代器则不能提取其triats。究其原因,是因为我自己实现的iterator_traits 中判断条件原因:// 版本1, 如果第二个模版参数为false执行template <typename Iterator, bool> struc原创 2021-07-14 00:09:50 · 131 阅读 · 0 评论