自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Tuffy

Get busy living, or get busy dying.

  • 博客(29)
  • 收藏
  • 关注

原创 Ch11. Threads 线程

11.1 引言​ 了解如何使用多个控制线程(简称线程) 在单进程环境中执行多个任务。一个进程中的所有线程都可以访问该进程的组成部件,如文件描述符fd和内存。​ 不管在什么情况下,只要单个资源需要在多个用户间共享,就必须处理一致性问题。本章最后讨论目前可用的线程同步机制,防止多个线程在共享资源时出现不一致问题11.2 线程概念​ 典型的UNIX进程可以看成只有一个控制线程:一个进程在某一时刻只能做一件事情。有了多个控制线程以后,在程序设计时就可以把进程设计在某一个时刻下能够做不止一件事,每个线程处理各

2021-07-22 00:33:36 913

原创 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

原创 20 cout

cout 简介全局流对象gunc 2.9ostream & operator (ostream & os, const T& a){ ... return os; }

2021-07-20 22:46:20 82

原创 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 75

原创 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

原创 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 71

原创 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

原创 15 仿函数和函数对象

仿函数和函数对象​ 容易写一些小的组件融入到标准库中,作为辅助,functor只为了算法来服务仿函数​ 使用函数模版实现,使用时指定参数类型​ identity. select1st, select2nd;​ 标准库提供的functor都有继承关系,我们自己写的都是单独的struct,没有继承表示没有融入STL的体系结构​ 在gnuc 4.9中名称发生了改变,用户代码要进行修改less<int>(); // 产生了一个临时的对象greater<int>(); /

2021-07-19 22:12:31 79

原创 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 115

原创 13.算法的性质

迭代器的分类​ 标准库中的算法都是函数模版算法的两个版本,第三个参数要传递一个准则,仿函数迭代器的分类5种迭代器的分类:有继承的关系输入迭代器输出迭代器双向迭代器随机访问迭代器输出迭代器打印容器迭代器的类型产生的是临时对象使用了模版函数 + 迭代器萃取 traits最后两个特殊的迭代器迭代器的typeidtypeid取决于编译器的实现typeid#include <typeinfo> cout << typeid(vec

2021-07-19 01:08:27 129

原创 12. 数据结构hashtable

容器hashtable散列表associated container.空间足够时,一对一映射实际上不会有这么大的空间。空间不足时,可能会发生两个或者多个不同的元素映射到一个槽bucket中。如何解决哈希冲突?一次函数转移到下一个位置二次函数转移到下一个位置次数越高,插入,查找的效率越低。工业界上使用的是开放地址法Separate Channing使用链表来处理哈希碰撞的情况当链表中的元素很多时,搜索的效率降低,这时需要将链表打散. rehashing增加

2021-07-19 01:02:56 130

原创 11.数据结构RBTree

RBTree​ 红黑树是一种适度平衡的二叉搜索树,排列规则有利于插入和查找,并且会自动保持平衡。没有任何分支过深。​ 是一种半线性结构,按照正常的遍历规则,得到的是排序状态(sorted)​ 不应该使用迭代器去修改元素的值,因为元素有着严谨的排列规则,编程层面上没有阻止。如此设计是正确的​ 基于红黑树的容器适配器set/multisetMap/multimap两种insertion操作,对应set/multiset, map/multimap容器RBTreekey和data

2021-07-16 23:31:44 106 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 70

原创 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 50

原创 8.容器vector

vector​ 动态扩容的数组:加倍策略 reallocationgnuc 2.9​ 维护三个指针,sizeof(vector) = 12 /24 ;startfinishEnd_of_storage实现动态扩容每次扩容都有大量的拷贝动作-> 拷贝构造函数和析构函数​ insert_aux 函数还会被insert方法调用,插入动作也会导致扩容,所以有插入点前和插入点后的东西,要将插入点后面的元素也拷贝过来。​ 每次扩容都有大量的元素拷贝动作,并且原来的元素也要销毁掉。

2021-07-15 23:39:22 53

原创 7.容器 list

容器 List双向循环链表数据成员:nodenode 中 有两个void* 指针,一个T类型元素。源码中有很多的typedef,需要往前找到底是什么类型注意void* 应该在后面操作时转换为T*分配器使用的是 allociterator - smart pointer在链表的结束位置放置了一个哨兵节点:list.end();对迭代器++时应该指向链表的下一个节点,而不是单纯的指针++操作使用运算符重载(5个)来实现dereference成员访问运算符前置++

2021-07-15 23:30:44 63

原创 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 110

原创 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 149

原创 4.体系结构与内核分析

STL源码分析​ 源码之前 了无秘密基础:c++ 基本语法模版基础:事半功倍数据结构与算法:如鱼得水标准库版本:Visual C++gnucOOP vs. GP(Generic Programming)​ STL 使用的是泛型编程思想,早期版本是没有虚函数的,很少有继承关系。OOP试图将对象和方法关联在一起GP 采用模版来设计标准库标准库的sort算法需要的迭代器需要支持随机访问。list 不支持随机访问,只能一步一步来。所以list不能使用全局的sort算法来进

2021-07-15 23:10:29 65

原创 STL使用分配器allocator

使用分配器allocatorSTL提供默认的分配器自己实现分配器容器中默认的分配器测试分配器​ 搭配不同分配器的写法直接调用allocate和deallocate脱离了容器,没有必要这么使用。要记住申请了多少内存,在归还时告诉deallocate。...

2021-07-14 23:28:43 142 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

原创 STL6大组件

STL 6 大组件6 大组件以及之间的关系容器 containers: 存放元素的容器分配器 allocators :为容器分配内存算法 algorithms : 通过迭代器来操作容器中的元素迭代器 iterators :泛化的指针,pointer-like-class ,类似C中的指针适配器 adapters :对容器,仿函数,迭代器做转换仿函数 functors : C++中使用函数对象,c中使用函数指针eg 1. application#include <vector&gt

2021-07-14 23:07:03 141

原创 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 129

原创 模版函数 + 递归 + 默认参数

模版函数 + 递归 + 默认参数​ 在写模版函数 mergesort时,遇到默认参数指定问题。源代码错误的版本void test01(){ using namespace std; int arr[8] = {1,5,2,4,3,7,8,6}; #if 1 v0::mergesort(arr, arr + 8, greater<int>()); // 这里传入的函数对象是greater<int> 类型 for(auto a : ar

2021-06-30 23:47:53 98

原创 vscode c++语法检查以及指定c++标准

vscode c++语法检查以及指定c++标准下载插件 C/C++ Clang Command Adapter​ 在extension中搜索并下载安装,使用时发现其语法检查不支持c++11 标准。需要在配置中指定。在插件的配置中指定c++标准在Cxxflags 中指定需要的c++标准即可。配置完成后可以看到没有再显示语法错误了。...

2021-06-29 13:06:25 7676

原创 LeetCode56. 合并区间

LeetCode56. 合并区间56. 合并区间//输入: [[1,6],[2,4],[8,10],[15,18]]//输出: [[1,6],[8,10],[15,18]]//解释: 区间 [1,6] 和 [2,4] 重叠, 将它们合并为 [1,6].class Solution {public: vector<vector<int>> merge(...

2019-12-20 01:20:47 186

原创 快速幂计算 pow(x, n)

快速幂计算 pow(x, n) double myPow(double x, int n) { long long N = n; if (N < 0) // 输入处理 { x = 1 / x; N = -N; } double ans = 1; ...

2019-12-11 22:27:22 269

原创 插入排序(insertion sort)

插入排序(insertion sort)插入排序算法适用于包括向量与列表在内的任何序列结构​ 插入排序的算法可以简要描述为:始终将序列划分为两个部分: 有序的前缀,无序的后缀;通过迭代,反复的将后缀中的元素移动到前缀中。由此可以看出插入排序算法的不变性:​ 在任何时刻,相对于当前节点e = S[r], 前缀S[0,r]总是业已有序​ 算法开始时前缀为空,不变性自然满足。接下来,借...

2019-12-11 22:24:11 159

原创 归并排序(Merge Sort)

归并排序(Merge Sort)​ **归并排序(mergesort)的构思朴实而深刻,作为一个算法即古老又仍不失生命力。在排序算法的发展历史上,归并排序具有特殊的历史地位,它是第一个可以在最坏情况下依然保持O(nlogn)**运行时间的确定性排序算法。​ 无序向量的递归分解+有序向量的逐层合并(二路归并算法)。1. int 类型 mergesort // 对arr中的[lo, hi)...

2019-11-28 14:53:32 399

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除