
C++标准库使用
文章平均质量分 81
以实例介绍C++标准库使用
flysnow010
毕业于北京科技大学,有超过20年软件开发经验。
展开
-
C++并发之环形队列(ring,queue)
最近研究了C++11的并发编程的线程/互斥/锁/条件变量,利用互斥/锁/条件变量实现一个支持多线程并发的环形队列,队列大小通过模板参数传递。环形队列是一个模板类,有两个模块参数,参数1是元素类型,参数2是队列大小,默认是10。入队操作如果队列满阻塞,出队操作如果队列为空则阻塞。原创 2024-06-25 16:50:26 · 871 阅读 · 0 评论 -
C++并发之阻塞队列(block,queue)
最近研究了C++11的并发编程的线程/互斥/锁/条件变量,利用互斥/锁/条件变量实现一个支持多线程并发的阻塞队列,队列大小没有限制。阻塞队列是一个模板类,有两个模块参数,参数1是元素类型,参数2是容器类型,可以是std::deque和std::list,默认是std::deque。入队操作没有阻塞,出队操作如果队列为空则阻塞。原创 2024-06-25 16:34:27 · 889 阅读 · 0 评论 -
C++并发之协程实例(四)(通过迭代器访问生成器序列)
协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。原创 2024-06-24 17:09:36 · 247 阅读 · 0 评论 -
我的C++20协程教程
粗略地说,协程是可以相互调用但不共享堆栈的函数,因此可以在任何时候灵活地暂停执行以进入不同的协程。在C++的真正精神中,C++20协程被实现为一个埋在垃圾堆下面的漂亮的小金块,你必须费力才能访问到漂亮的部分。坦率地说,我对这个设计感到失望,因为最近的其他语言变化都做得更有品味,但遗憾的是,没有协同工作。进一步混淆协程的是,C++标准库实际上并没有提供访问协程所需的垃圾堆,所以你实际上必须滚动自己的垃圾,然后费力地浏览它。无论如何,无论如何,我会尽量把任何进一步的评论留到这篇博客文章的结尾…翻译 2024-06-24 16:23:39 · 327 阅读 · 0 评论 -
C++并发之协程实例(三)(co_await)
协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。原创 2024-06-23 15:07:19 · 475 阅读 · 0 评论 -
C++并发之协程实例(二)(计算斐波那契序列)
协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。斐波那契数列是一位意大利的数学家,他闲着没事去研究兔子繁殖的过程,研究着就发现,可以写成这么一个序列:1,1,2,3,5,8,13,21…也就是每个数等于它前两个数之和。那么给你第 n 个数,问 F (n) 是多少。用数学公式表示很简单: f(n) = f(n-1) + f(n-2)原创 2024-06-21 12:50:27 · 437 阅读 · 0 评论 -
C++并发之协程(Coroutines,co_await,co_yield, co_return)
协程(Coroutines )是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。翻译 2024-06-20 10:39:58 · 381 阅读 · 0 评论 -
C++并发之协程实例(一)(coroutine, std::coroutine_handle, std::suspend_never, std::suspend_always)
协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回到调用方来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列上的算法和其他用途。原创 2024-06-18 17:33:23 · 823 阅读 · 0 评论 -
C++并发之原子操作(std::atomic)
原子类型是封装一个值的类型,该值的访问保证不会导致数据争用,并且可以用于同步不同线程之间的内存访问。这个头文件(atomic)声明了两个C++类,atomic和atomic_flag,它们在自包含类中实现原子类型的所有特性。头文件(atomic)还声明了一整套与C中的原子支持兼容的C样式类型和函数。原创 2024-06-17 16:12:45 · 1392 阅读 · 0 评论 -
C++并发之Future(std::future, std::promise, std::packaged_task, std::async)
Future允许异步访问特定提供程序设置的值的功能,这可能在不同的线程中。这些提供程序(providers)中的每一个(要么是promise对象,要么是package_task对象,要么调用async)都与Future对象共享对共享状态的访问:提供程序使共享状态就绪的点与Future对象访问共享状态的点同步。原创 2024-06-14 18:14:41 · 1134 阅读 · 0 评论 -
C++并发之条件变量(std::condition_variable)
条件变量是一个能够阻塞调用线程直到被通知恢复的对象。当调用其中一个等待函数时,它使用unique_lock(通过互斥锁)来锁定线程。线程保持阻塞状态,直到被另一个调用同一condition_variable对象上的通知函数的线程唤醒。条件变量类型的对象总是使用unique_lock来等待.原创 2024-06-14 18:10:15 · 549 阅读 · 0 评论 -
C++并发之锁(std::lock_guard,std::unique_lock)
锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。在构造时,互斥对象被调用线程锁定,在析构时,互斥被解锁。它是最简单的锁,作为一个具有自动持续时间的对象特别有用,该对象会持续到其上下文结束。通过这种方式,它可以保证互斥对象在抛出异常时正确解锁。但请注意,lock_guard对象不会以任何方式管理互斥对象的生存期:互斥对象的持续时间应至少延长到锁定它的lock_guad被析构为止。唯一锁是一个在锁定和未锁定两种状态下管理具有唯一所有权的互斥对象的对象。原创 2024-06-12 18:18:54 · 1423 阅读 · 0 评论 -
C++并发之定时互斥(std::timed_mutex)
定时互斥是一种时间可锁定的对象,它设计用于在代码的关键部分需要独占访问时发出信号,就像常规互斥一样,但还支持定时尝试锁定请求。因此,timed_mutex有两个额外的成员:try_lock_for和try_lock_until。它保证是一个标准布局类。标准布局类型是一种具有简单线性数据结构和访问控制的类型,可以很容易地用于与用其他编程语言(如C)编写的代码进行通信.原创 2024-06-12 17:54:42 · 440 阅读 · 0 评论 -
C++并发之互斥(std::mutex)
互斥锁是一个可锁定的对象,用于在代码的关键部分需要独占访问时发出信号,防止具有相同保护的其他线程同时执行并访问相同的内存位置。互斥对象提供独占所有权,不支持递归性(即,线程不应锁定其已经拥有的互斥对象)——请参阅recursive_mutex,以获取可以锁定的替代类。原创 2024-06-04 17:47:09 · 230 阅读 · 0 评论 -
C++并发之线程(std::thread)
类来表示执行的各个线程。执行线程是指可以在多线程环境中与其他此类序列同时执行的指令序列,同时共享相同的地址空间。初始化的线程对象表示执行的活动线程;这样的线程对象是可连接(joinable)的,并且具有唯一的线程id。默认构造(未初始化)的线程对象是不可连接的,其线程id对于所有不可连接线程都是通用的。如果移动赋值,或者对可连接线程调用join或detach,则可连接(joinable)线程将变为不可连接线程。原创 2024-06-04 15:47:31 · 512 阅读 · 0 评论 -
C++容器之迭代器(iterator)
迭代器是指任何指向元素范围(如数组或容器)中某个元素的对象,该对象能够使用一组运算符(至少使用增量(++)和取消引用(*)运算符)在该范围的元素中进行迭代。迭代器最明显的形式是指针:指针可以指向数组中的元素,并可以使用增量运算符(++)对它们进行迭代。但是其他类型的迭代器也是可能的。例如,每个容器类型(如列表)都有一个特定的迭代器类型,用于遍历其元素。请注意,虽然指针是迭代器的一种形式,但并非所有迭代器都具有相同的指针功能;原创 2024-05-30 14:41:56 · 1889 阅读 · 0 评论 -
C++容器之前向链表(std::forward_list)
前向列表是序列容器,允许在序列中的任何位置进行恒定时间的插入和擦除操作。前向列表被实现为单链表;单链表可以将它们所包含的每个元素存储在不同且不相关的存储位置。通过与序列中下一个元素的链接的每个元素的关联来保持排序。forward_list容器和list容器之间的主要设计区别在于,前者在内部只保留一个到下一个元素的链接,而后者为每个元素保留两个链接:一个指向下一个元件,一个指向前一个元件。这允许在两个方向上进行高效迭代,但每个元件消耗额外的存储空间,插入和删除元件的时间开销略高。原创 2024-05-30 14:37:11 · 984 阅读 · 0 评论 -
C++容器之队列(std::queue)
队列是一种容器适配器,专门设计用于在FIFO上下文(先进先出)中操作,其中元素被插入容器的一端并从另一端提取。队列被实现为容器适配器,容器适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素被推入特定容器的“后部”,并从其“前部”弹出。底层容器可以是标准容器类模板或某些其他专门设计的容器类之一。empty 是否为空size 队列大小front 队首元素back 队尾元素push_back 入队pop_front 出队。原创 2024-05-29 09:28:52 · 263 阅读 · 0 评论 -
C++容器之链表(std::list)
列表是序列容器,允许在序列中的任何位置进行恒定时间的插入和擦除操作,以及双向迭代。列表容器被实现为双链表;双链接列表可以将它们所包含的每个元素存储在不同且不相关的存储位置。排序是通过与每个元素的关联在内部保持的,其中链接到它前面的元素,链接到它后面的元素。它们与forward_list非常相似:主要区别在于forward_liist对象是单链表,因此它们只能向前迭代,以换取更小、更高效。原创 2024-05-29 09:26:14 · 1242 阅读 · 0 评论 -
C++容器之栈(std::stack)
堆栈是一种容器适配器,专门设计用于在后进先出(后进先出)环境中操作,其中元素仅从容器的一端插入和提取。堆栈被实现为容器适配器,容器适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素是从特定容器的“后部”推/弹出的,即堆栈的顶部。底层容器可以是任何标准容器类模板或某些其他专门设计的容器类。empty 是否为空size 栈大小back 栈顶元素push_back 入栈pop_back 出栈。原创 2024-05-28 14:07:05 · 516 阅读 · 0 评论 -
C++容器之双端队列(std::deque)
deque(通常发音像“deck”)是双端队列的一个不规则缩写。双端队列是具有动态大小的序列容器,可以在两端(前端或后端)进行扩展或收缩。特定的库可以以不同的方式实现deques,通常作为某种形式的动态数组。但在任何情况下,它们都允许通过随机访问迭代器直接访问单个元素,并根据需要通过扩展和收缩容器来自动处理存储。因此,它们提供了类似于矢量的功能,但也在序列的开始处,而不仅仅是在序列的结束处,有效地插入和删除元素。原创 2024-05-28 13:55:05 · 868 阅读 · 0 评论 -
C++容器之向量(std::vector)
矢量(vector)是序列容器,表示可以更改大小的数组。就像数组一样,向量为其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中一样高效。但与数组(array)不同的是,它们的大小可以动态变化,其存储由容器自动处理。在内部,向量使用动态分配的数组来存储其元素。当插入新元素时,可能需要重新分配此数组以增加其大小,这意味着分配一个新数组并将所有元素移动到该数组。就处理时间而言,这是一项相对昂贵的任务,因此,每次向容器中添加元素时,矢量不是每次都重新分配。原创 2024-05-27 17:40:36 · 1344 阅读 · 0 评论 -
C++容器之优先队列(std::priority_queue)
优先级队列是一种容器适配器,专门设计为根据一些严格的弱排序标准,它的第一个元素始终是它所包含的元素中最大的一个。此上下文类似于堆(heap),在堆中,元素可以随时插入,并且只能检索最大堆元素(优先级队列中最顶端的元素)。优先级队列被实现为容器适配器,容器适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素从特定容器的“后部”弹出,即优先级队列的顶部。底层容器可以是任何标准容器类模板或某些其他专门设计的容器类。原创 2024-05-27 17:22:37 · 766 阅读 · 0 评论 -
C++容器之无序多重映射(std::unordered_multimap)
无序多重映射是关联容器,存储由键值和映射值的组合形成的元素,与无序映射容器非常相似,但允许不同的元素具有等效的键。 在无序多重映射中,键值通常用于唯一标识元素,而映射的值是具有与该键相关联的内容的对象。键和映射值的类型可能不同。 在内部,无序多重映射中的元素没有根据其键值或映射值按任何特定顺序排序,而是根据其哈希值组织到桶中,以允许直接通过其键值快速访问各个元素(平均具有恒定的平均时间复杂度)。原创 2024-05-26 19:50:46 · 851 阅读 · 0 评论 -
C++容器之无序映射(std::unordered_map)
无序映射是一种关联容器,用于存储由键值和映射值组合而成的元素,并允许基于其键快速检索单个元素。 在无序映射中,键值通常用于唯一标识元素,而映射的值是一个对象,其内容与该键相关联。键和映射值的类型可能不同。 在内部,无序映射中的元素不按任何特定的顺序相对于其键值或映射值进行排序,而是根据其哈希值组织到桶中,以允许直接通过其键值快速访问各个元素(平均具有恒定的平均时间复杂度)。 无序映射容器比映射容器更快地通过关键字访问单个元素,尽管它们通常在通过元素子集进行范围迭代时效率较低。 无序映射实现了直接原创 2024-05-26 19:46:36 · 1226 阅读 · 0 评论 -
C++容器之无序多集(std::unordered_multiset)
无序多集是不按特定顺序存储元素的容器,允许根据单个元素的值快速检索这些元素,与无序集容器非常相似,但允许不同的元素具有相同的值。原创 2024-05-25 17:24:05 · 993 阅读 · 0 评论 -
C++容器之无序集(std::unordered_set)
无序集是不按特定顺序存储唯一元素的容器,允许根据单个元素的值快速检索这些元素。原创 2024-05-25 17:09:52 · 963 阅读 · 0 评论 -
C++容器之多重映射(std::multimap)
多重映射是关联容器,用于存储由键值和映射值的组合形成的元素,遵循特定顺序,并且其中多个元素可以具有等效键。原创 2024-05-24 13:58:17 · 926 阅读 · 0 评论 -
C++容器之映射(std::map)
映射是关联容器,存储由键值和映射值的组合组成的元素,遵循特定的顺序。原创 2024-05-23 17:50:01 · 1282 阅读 · 0 评论 -
C++容器之多集(std::multiset)
多集是按照特定顺序存储元素的容器,其中多个元素可以具有等效值原创 2024-05-23 10:59:27 · 1672 阅读 · 0 评论 -
C++容器之集合(std::set)
集合(set)是按照特定顺序存储唯一元素的容器。原创 2024-05-22 18:08:53 · 948 阅读 · 0 评论 -
C++容器之位集(std::bitset)
位集存储位(只有两个可能值的元素:0或1,true或false,…)。原创 2024-05-22 18:05:49 · 831 阅读 · 0 评论 -
C++容器之元组(std::tuple)
元组(tuple)是将不同类型的元素打包在一个对象中的对象,就像对对象对元素对所做的那样,但对任何数量的元素都是通用的。原创 2024-05-21 15:11:35 · 578 阅读 · 0 评论 -
C++容器之数组(std::array)
数组(array)是固定大小的序列容器:它们包含以严格线性序列排序的特定数量的元素。原创 2024-05-21 15:07:28 · 750 阅读 · 0 评论