02 | C++lambda容易忽略的点
摘要:1.模板化的lambda 如果我们的 lambda 接收容器(假定我们老老实实的传入容器),并且要提取出容器中的元素类型,应该怎么做呢? 之前我们可能这样做 auto f=[](auto vector){ using T=typename decltype(vector)::value_type;
阅读全文
posted @
2023-04-26 10:15
独立树
阅读(60)
推荐(0)
03 | 写一个能产生斐波那契数列的range——惰性求值
摘要:1.首先为了满足 range 概念的要求我们需要提供 begin() 和 end() 2.begin() 和 end() 返回的应该是迭代器,注意这个地方两种可以返回两种不同类型(c++17后即可) 3.为了满足迭代器 概念的要求我们提供5个 typedef,并根据 std::input_itera
阅读全文
posted @
2023-04-23 11:32
独立树
阅读(69)
推荐(0)
02 | 产生0,1,2...的序列大致有几种方法
摘要:1.写死的for循环 2.生成序列和打印序列分开(占据极大的内存) 3.用static来实现(缺点:引入了全局的状态) 4.用类来实现(缺点:编写类定义太麻烦) 5.使用 lambda 闭包init 6.使用协程 注意,此处的协程类是需要自己的实现的。
阅读全文
posted @
2023-04-23 11:17
独立树
阅读(35)
推荐(0)
01 | ranges的初步印象(新旧做法的对比)
摘要:1.ranges::sort——给容器排序 在这之前我们需要采用 标准库的sort 算法并且需要传入两个迭代器。但是现在我们可以这样,使用 ranges 命名空间下的 sort 函数,仅需要传入一个容器的名字即可。 以下是涉及到的concepts 2.views的概念——给对象进行筛选、转换、复制
阅读全文
posted @
2023-04-23 11:11
独立树
阅读(183)
推荐(0)
01 | C++ADL(依赖于参数的查询)
摘要:namespace MyNamespace { class MyClass {}; void doSomething(MyClass); } MyNamespace::MyClass obj; // global object int main() { doSomething(obj); // Wo
阅读全文
posted @
2023-04-10 15:47
独立树
阅读(48)
推荐(0)
02 | C++17中的异常规格说明(noexcept)
摘要:异常规范 (throw、noexcept) (C++) | Microsoft Learn 相信大家都已经熟悉了在标准库函数后面常常看到的 noexcept 函数。其含义是明确告诉编译器该函数不会抛出异常。(但如果你抛出了异常,程序会立即中止,注意立即中止和未定义行为不是一个概念!!). 推荐大家了
阅读全文
posted @
2023-04-10 15:33
独立树
阅读(338)
推荐(0)
01 | C语言异常处理(jmp_buf、setjmp、longjmp)
摘要:首先说明,C语言中的异常处理主要还是 错误码的思路. 其次,C语言中是有 返回两次的函数的 ,比如说 fork()函数 在 C 语言中是没有 try catch 块的,但并不代表没有异常处理。 接下来我们简单明确三个概念,最后来一个简单的小例子。 1.三个概念 使用一个 jmp_buf 的类型变量来
阅读全文
posted @
2023-04-10 15:19
独立树
阅读(290)
推荐(0)
20 | 内存模型和atomic:理解并发的复杂性
摘要:今天我们来讨论一个略有点绕的问题,C++ 里的内存模型和原子量。 C++98 的执行顺序问题 C++98 的年代里,开发者们已经了解了线程的概念,但** C++ 的标准里则完全没有提到线程**。从实践上,估计大家觉得不提线程,C++ 也一样能实现多线程的应用程序吧。不过,很多聪明人都忽略了,下面的事
阅读全文
posted @
2022-05-08 23:20
独立树
阅读(755)
推荐(0)
19 | thread和future:领略异步中的未来
摘要:为什么要使用并发编程? 在本世纪初之前,大部分开发人员不常需要关心并发编程;用到的时候,也多半只是在单处理器上执行一些后台任务而已。只有少数为昂贵的工作站或服务器进行开发的程序员,才会需要为并发性能而烦恼。原因无他,程序员们享受着摩尔定律带来的免费性能提升,而高速的 Intel 单 CPU 是性价比
阅读全文
posted @
2022-04-27 21:04
独立树
阅读(579)
推荐(0)
08 | 多线程异步操作
摘要:std::future C11 中增加的线程类,使得我们能够非常方便的创建和使用线程,但有时会有些不方便,比如需要获取线程返回的结果,就不能通过 join() 得到结果,只能通过一些额外手段获得,比如:定义一个全局变量,在子线程中赋值,在主线程中读这个变量的值,整个过程比较繁琐。C 提供的线程库中提
阅读全文
posted @
2022-04-25 22:13
独立树
阅读(266)
推荐(0)
07 | 线程同步之原子变量
摘要:C++11 提供了一个原子类型 std::atomic,通过这个原子类型管理的内部变量就可以称之为原子变量,我们可以给原子类型指定 bool、char、int、long、指针等类型作为模板参数(不支持浮点类型和复合类型)。 由于原子操作是通过指令提供的支持,因此它的性能相比锁和消息传递会好很多。**
阅读全文
posted @
2022-04-23 22:26
独立树
阅读(936)
推荐(0)
06 | C++ 线程同步之条件变量
摘要:条件变量是 C11 提供的另外一种用于等待的同步机制,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时时,才会唤醒当前阻塞的线程。条件变量需要和互斥量配合起来使用,C11 提供了两种条件变量: condition_variable:需要配合 std::unique_lockstd::m
阅读全文
posted @
2022-04-22 21:13
独立树
阅读(342)
推荐(0)
05 | C++ 线程同步之互斥锁
摘要:解决多线程数据混乱的方案就是进行线程同步,最常用的就是互斥锁,在 C++11 中一共提供了四种互斥锁: std::mutex:独占的互斥锁,不能递归使用 std::timed_mutex:带超时的独占互斥锁,不能递归使用 std::recursive_mutex:递归互斥锁,不带超时功能 std::
阅读全文
posted @
2022-04-22 20:36
独立树
阅读(263)
推荐(0)
04 | call_once
摘要:在某些特定情况下,**某些函数只能在多线程环境下调用一次,比如:要初始化某个对象,而这个对象只能被初始化一次,**就可以使用 std::call_once() 来保证函数在多线程环境下只能被调用一次。使用 call_once() 的时候,需要一个 once_flag 作为 call_once() 的
阅读全文
posted @
2022-04-21 21:00
独立树
阅读(87)
推荐(0)
03 | this_thread命名空间
摘要:在 C++11 中不仅添加了线程类,还添加了一个关于线程的命名空间 std::this_thread,在这个命名空间中提供了四个公共的成员函数,通过这些成员函数就可以对当前线程进行相关的操作了。 get_id() 调用命名空间 std::this_thread 中的 get_id() 方法可以得到当
阅读全文
posted @
2022-04-21 20:43
独立树
阅读(169)
推荐(0)
02 | C++ 线程的使用
摘要:C++11 中提供的线程类叫做 std::thread,基于这个类创建一个新的线程非常的简单,只需要提供线程函数或者函数对象即可,并且可以同时指定线程函数的参数。我们首先来了解一下这个类提供的一些常用 API: 构造函数 // ① thread() noexcept; // ② thread( th
阅读全文
posted @
2022-04-21 20:29
独立树
阅读(578)
推荐(0)
01 | 处理日期和时间的 chrono 库
摘要:C++11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,为程序的开发提供了便利。chrono 库主要包含三种类型的类:时间间隔duration、时钟clocks、时间点time point。 基本常识 1.时间点的来源:钟(c++的不同类) 2.时间点
阅读全文
posted @
2022-04-21 19:59
独立树
阅读(1308)
推荐(0)
18 | 应用可变模板和tuple的编译期技巧
摘要:今天我们讲一个特殊的专题,如何使用可变模板和 tuple 来完成一些常见的功能,尤其是编译期计算。 可变模板 可变模板 是 C++11 引入的一项新功能,使我们可以在模板参数里表达不定个数和类型的参数。从实际的角度,它有两个明显的用途: 用于在通用工具模板中转发参数到另外一个函数 用于在递归的模板中
阅读全文
posted @
2022-04-20 23:02
独立树
阅读(301)
推荐(0)
17 | 函数式编程:一种越来越流行的编程范式
摘要:上一讲我们初步介绍了函数对象和 lambda 表达式,今天我们来讲讲它们的主要用途——函数式编程 一个小例子 如果给定一组文件名,要求数一下文件里的总文本行数,你会怎么做? 函数的原型: 我们期待接受两个 C 字符串的迭代器,用来遍历所有的文件名;返回值代表文件中的总行数。 int count_li
阅读全文
posted @
2022-04-18 22:04
独立树
阅读(381)
推荐(0)
16 | 函数对象和lambda:进入函数式编程
摘要:C++98 的函数对象 函数对象(function object) 自 C++98 开始就已经被标准化了。从概念上来说,函数对象是一个可以被当作函数来用的对象。它有时也会被叫做 functor,但这个术语在范畴论里有着完全不同的含义,还是不用为妙——否则玩函数式编程的人可能会朝着你大皱眉头的。 下面
阅读全文
posted @
2022-04-17 22:35
独立树
阅读(151)
推荐(0)