C++11/14/17/20
C++11/14/17/20
丸子叮咚响
日拱一卒,功不唐捐。
展开
-
C++14 lambda的捕获列表初始化
在C++11中lambda捕获列表有两种方式:值捕获和引用捕获,捕获的是外层作用域的变量,也就是左值。C++14进行了扩展,允许捕获的成员用任意的表达式进行初始化,相当于允许捕获右值。举例int x = 100;auto f = [x = 0]() mutable { return x++; };std::cout << "f()=" << f() << std::endl;std::cout << "f()=" << f() &l.原创 2021-12-15 20:43:26 · 2150 阅读 · 0 评论 -
C++14 泛型lambda
即lambda的参数列表中可以使用auto。// 执行 g++ -c -std=c++11 generic_lambdas.cpp 通过auto f = [](int a) {std::cout << a << std::endl;};// 执行 g++ -c -std=c++11 generic_lambdas.cpp 报错// generic_lambdas.cpp:7:13: error: 'auto' not allowed in lambda parame.原创 2021-12-15 20:01:28 · 1026 阅读 · 0 评论 -
C++14 变量模板
目录定义定义举例使用参考定义变量模板定义一族变量或者类静态数据成员。template < parameter-list > variable-declaration定义举例定义一族变量template<class T>constexpr T pi = T(3.1415926);定义一族类静态数据成员using namespace std::literals;struct matrix_constants{ template<clas原创 2021-12-03 20:24:33 · 1191 阅读 · 0 评论 -
C++ 拷贝操作
目录一 strcpy二 strncpy三 memcpy四 std::copy std::copy_if std::copy_n std::copy_backward五 参考一 strcpy头文件< cstring >语法char* strcpy( char* dest, const char* src );解释拷贝src到dest中,包括结束空字符如果dest不够大或者两个字符串的范围有重叠,其行为未定义返回值为destdemo // strc原创 2021-06-11 19:58:18 · 2259 阅读 · 0 评论 -
std::vector 元素位置变化时的处理
简述当 push_back、insert、reserve、resize 等函数导致内存重分配时,或当 insert、erase 导致元素位置移动时,vector 会试图把元素“移动”到新的内存区域。vector 通常保证强异常安全性,如果元素类型没有提供一个保证不抛异常的移动构造函数,vector 通常会使用拷贝构造函数。demo//// main.cpp//// Created by wz on 2020/12/27.//#include <iostream>#in原创 2020-12-27 23:55:21 · 999 阅读 · 0 评论 -
C++11 std::move (1)
写在前面在 C++11 右值引用(3)std::move 基础上再谈谈 std::move。C++11 开始,对于返回本地对象的函数,并不建议使用 std::move, 因为其反而对编译器的返回值优化(named return value optimization,或 NRVO)造成影响。直接返回即可。Demo// by 吴咏炜#include <iostream>#include <utility>using namespace std;class Ob原创 2020-12-25 01:17:37 · 199 阅读 · 0 评论 -
C++11 Prefer Locks to Mutexes(译)
点击查看原文 Prefer Locks to MutexesIf the previous post showed something, it’s, that you should use mutexes with great care. That’s why you should wrap them in a lock.上篇说明了需要特别小心使用 mutex (否则容易出现死锁问题)。我们应该通过 lock 使用 mutex。LocksLocks take care of thier.翻译 2020-12-01 14:03:15 · 174 阅读 · 0 评论 -
C++11 Mutex的风险(译)
点击查看原文 The Risks of Mutexes。文章主要通过介绍直接调用 mutex 的 lock 和 unlock 容易导致死锁,引出 lock(另外的博文,结尾链接)。The Risks of MutexesMutex的风险Usage of mutexes seems extremely simple. There is a critical section in the code, which can only be accessed by a single thread at .翻译 2020-11-23 14:05:33 · 363 阅读 · 0 评论 -
C++11 SFINAE概念介绍:类成员的编译时内省(译)
点击查看原文An introduction to C++'s SFINAE concept: compile-time introspection of a class memberC++的SFIEAE概念介绍:类成员的编译时内省Trivia:As a C++ enthusiast, I usually follow the annual C++ conference cppconf or at least try to keep myself up-to-date with the majo.翻译 2020-11-21 18:51:14 · 444 阅读 · 1 评论 -
C++11 SFINAE and enable_if (译)
点击查看 原文。There’s an interesting issue one has to consider when mixing function overloading with templates in C++. The problem with templates is that they are usually overly inclusive, and when mixed with overloading, the result may be surprising:在C++.翻译 2020-11-21 10:57:15 · 253 阅读 · 0 评论 -
C++11 decay
一 定义头文件 <type_traits>template< class T >struct decay; (since C++11)二 作用退化类型的修饰。为类型T应用从左值到右值(lvalue-to-rvalue)、数组到指针(array-to-pointer)和函数到指针(function-to-pointer)的隐式转换。转换将移除类型T的cv限定符(const和volatile),并定义结果类型decay::type。这种转换很类似于函数参数按值传递时发原创 2020-11-20 16:28:51 · 4484 阅读 · 0 评论 -
C++11 defer_lock try_to_lock adopt_lock
一 类型1. std::defer_lock_t 、 std::try_to_lock_t 和 std::adopt_lock_t 是用于为 std::lock_guard(C++11) 、 std::scoped_lock(C++14) 、 std::unique_lock(C++11) 和 std::shared_lock(C++17) 指定锁定策略的空结构体标签类型。2. std::defer_lock 、 std::try_to_lock 和 std::adopt_lock 分别是 std::原创 2020-10-20 20:35:39 · 1006 阅读 · 0 评论 -
C++11 condition_variable
目录一 condition_variable二 定义三 通知四 等待五 例子六 参考一 condition_variablecondition_variable 类是同步原语,能用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 condition_variable 。常用于生产-消费场景。生产线程通过 notify_one 或者 notify_all 通知消费线程,消费线程有任务则消费,无任务时通过 wait、wait_for 或 wait_until 进行等待。二原创 2020-10-15 09:59:23 · 206 阅读 · 0 评论 -
C++11 timed_mutex
目录一 timed_mutex二 try_lock_for三 try_lock_until四 recursive_timed_mutex五 参考一 timed_mutex前文C++11 std::mutex中介绍了,mutex 均具有 lock、 try_lock、unlock等成员函数。timed_mutex 增加了带时限的 try_clock。即 try_lock_for、try_lock_until。定义// 头文件 <mutex>class timed_mutex原创 2020-10-12 19:54:46 · 2144 阅读 · 0 评论 -
C++11 packaged_task
目录一 packaged_task二 定义三 成员函数四 get_future五 执行函数1. operator()2. make_ready_at_thread_exit3. demo六 reset七 参考一 packaged_task前文 C++11 async 可知,异步操作的方式之一是:std::async + std::future 。前文 C++11 promise 可知,获取 std::thread 异步执行结果的方法之一是:std::promise + std::future。将原创 2020-10-12 15:03:46 · 288 阅读 · 0 评论 -
C++11 promise
目录一 promise二 定义三 成员函数四 get_future五 设置结果1. set_value2. set_value_at_thread_exit3. set_exception4. set_exception_at_thread_exit六 参考一 promise前文 C++11 async 可知,异步操作的方式之一,是通过 std::async 接口调用可执行对象,然后通过 std::future 获得结果。另一种常见方式是在指定的 std::thread 中执行,如何获取在 std:原创 2020-10-10 18:26:34 · 1753 阅读 · 0 评论 -
C++11 async
目录一 前面二 定义三 例子四 参考一 前面C++11开始,对并发提供了强有力的支持,本文介绍其中的 std::async。头文件< future >二 定义template< class Function, class... Args>std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>> async( Fun原创 2020-10-10 08:43:51 · 784 阅读 · 0 评论 -
C++11 future
目录一 前面二 future三 成员函数三 例子四 shared_future五 参考一 前面C++11开始,对并发提供了强有力的支持,本文介绍其中的 future 和 shared_future。二 future类模板 std::future 提供访问异步操作结果的机制。通常与 std::async、std::packaged_task、std::promise等搭配使用。三 成员函数构造函数future() noexcept; (1)(C++11 起)future( fut原创 2020-10-09 20:48:04 · 756 阅读 · 0 评论 -
C++11 time_point
目录一 chrono库二 time_point三 成员类型四 Demo辅助函数五 成员函数1 构造函数2 time_since_epoch3 operator+= operator-=3 min max [static]4 operator++ ++(int) -- --(int) (C++20)六 非成员函数1 算术运算2 关系运算3 time_point_cast4 floor ceil round七 辅助类std::common_type< std::chrono::time_point &g原创 2020-09-30 15:01:16 · 4729 阅读 · 0 评论 -
C++11 clock
目录一 简介二 system_clock三 steady_clock四 high_resolution_clock五 参考一 简介C++11 在chrono库中提供了三种时钟 clock: system_clock,steady_clock 和 high_resolution_clock。头文件 < chrono >。二 system_clocksystem_clock 来自系统范围实时时钟的壁钟时间(wall clock)。system_clock是唯一有能力映射其时原创 2020-09-29 18:32:57 · 681 阅读 · 0 评论 -
C++11 基于范围的循环
一 语法C++11增加了基于范围的循环,语法如下:attr(optional) for ( range_declaration : range_expression ) loop_statement (until C++20)attr(optional) for ( init-statement(optional)range_declaration : range_expression ) loop_statement (since C++20)二 举例应用于容器{原创 2020-08-25 20:15:08 · 209 阅读 · 0 评论 -
C++11 std::duration
目录一 chrono库二 duration三 成员类型四 De辅助函数五 成员函数1 count2 zero min max [static]3 operator+ operator-(unary)4 operator++ operator--5 compound assignment六 非成员函数1 算术运算2 关系运算3 duration_cast4 floor ceil round abs [C++17]5 operator<< from_stream [C++20]七 辅助类型八原创 2020-07-03 15:29:17 · 2083 阅读 · 0 评论 -
C++ 标准库 变序型算法
目录一 概述二 辅助函数三 std::reverse四 std::reverse_copy五 std::rotate六 std::rotate_copy七 std::next_permutation八 std::prev_permutation九 std::shuffle(C++11)十 std::random_shuffle十一 std::partition十二 std::stable_partition十三 std::partition_copy十四 github十五 参考一 概述C++ 标准库中原创 2020-06-30 14:16:33 · 221 阅读 · 0 评论 -
C++11 算法 区间元素赋值
目录一 概述二 辅助函数三 定义四 Demo五 参考一 概述C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 区间元素赋值 的算法:std::fill 将一个给定值复制赋值给一个范围内的每个元素std::fill_n 将一个给定值复制赋值给一个范围内的 n 个元素二 辅助函数本文中Demo用到的辅助函数请参考此前文章 C++ 算法 查找元素。三 定义std::filltemplate< class Forwa原创 2020-06-19 17:45:27 · 1560 阅读 · 0 评论 -
C++11 算法 搬移元素
目录一 概述二 辅助函数三 定义四 Demo五 参考一 概述C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 区间元素搬移 的算法:std::move(C++11) 将某一范围的元素搬移到一个新的区间std::move_backyard(C++11) 按从后往前的顺序搬移一个范围内的元素二 辅助函数本文中Demo用到的辅助函数请参考此前文章 C++ 算法 查找元素。三 定义movetemplate< clas原创 2020-06-11 20:29:15 · 285 阅读 · 0 评论 -
C++ 算法 复制元素
目录一 概述二 辅助函数三 定义四 Demo五 参考一 概述C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 区间元素复制 的算法:std::copy 将某一范围的元素复制到一个新的位置std::copy_if(C++11) 将某一范围的满足条件的元素复制到一个新的位置std::copy_n(C++11) 将一定数目的元素复制到一个新的位置std::copy_backyard 按从后往前的顺序复制一个范围内的元素二 辅助函数原创 2020-06-10 09:39:13 · 348 阅读 · 0 评论 -
C++11 算法 检查区间元素
目录一 概述二 辅助函数三 定义四 Demo七 参考一 概述C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 区间元素检查 的算法:all_of(C++11) 检查一元谓词 p 是否对范围 [first, last) 中所有元素返回 trueany_of(C++11) 检查一元谓词 p 是否对范围 [first, last) 中至少一个元素返回 truenone_of(C++11) 检查一元谓词 p 是否不对范围 [first, las原创 2020-06-01 19:30:07 · 1409 阅读 · 0 评论 -
C++11 算法 区间是否构成堆
目录一 概述二 堆三 辅助函数四 std::is_heap(C++11)五 std::is_heap_until(C++11)六 Demo七 参考一 概述C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 区间是否构成堆 的算法:is_heap(C++11) 区间元素是否构成大堆is_heap_until(C++11) 查找能成为大堆的最大子范围二 堆性质堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树原创 2020-05-28 20:07:14 · 195 阅读 · 0 评论 -
C++11 算法 区间是否被分割
目录一 概述二 辅助函数三 std::is_partitioned(C++11)四 std::partition_point(C++11)五 Demo六 参考一 概述C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 区间是否被分割判断 的算法:is_partitioned(C++11) 区间是否按谓词进行分割partition_point(C++11) 返回已分割区间的分割点二 辅助函数本文中Demo用到的辅助函数请参考此前文原创 2020-05-25 20:27:14 · 316 阅读 · 0 评论 -
C++11 算法 区间是否排序或局部排序
目录一 概述二 辅助函数三 std::is_sorted(C++11)四 std::is_sorted_until(C++11)五 Demo六 参考一 概述C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 区间是否排序或局部排序判断 的算法:is_sorted(C++11) 区间是否排序is_sorted_until(C++11) 返回区间第一个破坏排序的元素二 辅助函数本文中Demo用到的辅助函数请参考此前文章 C++ 算法原创 2020-05-20 20:46:12 · 436 阅读 · 0 评论 -
C++ 算法 区间的比较
一 概述C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 区间比较 的算法:equal 检验相等性is_permutation(C++11) 测试不定序的相等性mismatch 查找第一处不同lexicographical_compare 字典次序比较二 辅助函数本文中Demo用到的辅助函数请参考此前文章 C++ 算法 查找元素三 std::equal定义std::equal 的定义式很多,也比较有代表性,挑出部原创 2020-05-20 08:38:31 · 760 阅读 · 0 评论 -
C++ 算法 查找元素
一 概述C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 查找元素 的算法:std::find 查找第一个匹配元素std::find_if 查找第一个匹配元素std::find_if_not(C++11) 查找第一个不匹配元素std::search_n 查找前n个连续匹配值std::search 查找第一个子区间std::find_end 查找最后一个子区间std::find_first_of 查找某些元素第一次出现位置st原创 2020-05-15 10:07:55 · 1497 阅读 · 0 评论 -
C++ 算法 元素最大值和最小值
一 写在前面本文介绍 C++ 标准库中的三个 用于获取元素最大值和最小值 的非更易型算法(nonmodifying algorithm): min_element、 max_element 和 min_max_element。同样均定义于头文件< algorithm >。二 Demo代码:#include <algorithm>#include <iostream>#include <iterator>#include <vecto原创 2020-05-13 20:29:45 · 2351 阅读 · 0 评论 -
C++11 函数对象(1)
从C++11开始,函数对象(function object)是以下的统称:1. 函数指针(function pointer)2. 仿函数(functor), 即带有成员函数operator()的class的实例3. 带有转换函数可将自己转换为pointer to function 的calss的实例4. lambda表达式...原创 2020-04-07 20:55:43 · 208 阅读 · 0 评论 -
C++ iterator(2) adaptor function
一 简介1.std::insertertemplate< class Container >std::insert_iterator<Container> inserter( Container& c, typename Container::iterator i ); (until C++20) template< class Contain...原创 2020-03-31 19:59:02 · 179 阅读 · 0 评论 -
C++11 std::ratio
一 简介头文件<ratio>template< std::intmax_t Num, std::intmax_t Denom = 1 >class ratio; (since C++11)1. std::ratio 支持编译期的有理数运算。2. 当 Num 和 Denom 是编译期的std::intmax_t的常量时,该模板的每个实例都精确表示某个有限...原创 2020-03-18 20:14:16 · 607 阅读 · 0 评论 -
C++11 std::declval
一 简介头文件<utility>template<class T>typename std::add_rvalue_reference<T>::type declval() noexcept; (C++11 起) 1. std::declval将T转换为引用类型。2. 通常在模板中使用std::declval。3. std::declv...原创 2020-03-16 19:26:54 · 466 阅读 · 0 评论 -
C++11 std::tuple
一 简介头文件 <tuple>template< class... Types >class tuple; (C++11)二 取值及辅助函数#include <functional> // tie#include <iostream> // cout cin#include <tuple> /...原创 2020-03-10 08:46:17 · 652 阅读 · 0 评论 -
C++11 recursive_mutex
一 简介头文件<mutex>class recursive_mutex; c++111. 调用线程从成功调用 lock 或 try_lock 开始占有recursive_mutex, 期间线程可以进行对 lock 或 try_lock的附加调用,所有权在线程调用 unlock 匹配次数时结束。2. 线程占有recursive_mutex时,若其他线程要求recursiv...原创 2020-02-28 19:34:24 · 10469 阅读 · 2 评论 -
C++11 enum
一 C++11前在C++11前我们关于枚举enum有两个常见的问题,1是无作用域,同一个文件中两个不同枚举中具有同名枚举项就会报错。2是不能确定枚举项的值的整数类型,或者说枚举的底层类型(underlying type)不明确。下面的例子会报错:enum Type { kText = 1,};enum Msg { kText = 2,};二 C++11在C+...原创 2019-11-22 19:50:19 · 724 阅读 · 0 评论