首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

高效使用stl::mapstd::set

1、低效率用法 // 先查找是否存在,如果不存在,则插入 if (map.find(X) == map::end()) // 需要find一次 {     map.insert(x); // 需要find...; // 需要find一次 // 对于erase存在同样低效用法 if (map.count(X) > 0) // 需要find一次 {     map.erase(X); // 需要find一次 }...else {     // 不存在时处理 } 2、高效率用法 // 解决办法,充分利用insert和erase返回值,将find次数降为1 map::size_type num_erased =...map.erase(X); // 需要find一次 if (0 == num_erased) {     // 不存在时处理 } else {     // 存在且删除后处理 } pair result_inserted...; result_inserted = map.insert(X); if (result_inserted.second) {     // 不存在,插入成功后处理 } else {     //

2.9K20

std::optional:解决值存在性问题利器

背景 查找std::vector内首个偶数,如果存在则返回该偶数;可是如果std::vecotr内不存在偶数时,该如何?...,为接口使用增加了复杂度,基于此C++17提出了std::optional,用于解决值可能存在也可能不存在问题。...std::optional作为一个模板类,用于管理一个可选容纳值(此处与std::tuple还是有区别的,tuple可以容纳n个值,获取函数执行结果n种方式),容纳值可以是自定义类型,甚至是另一个...注意 std::optional容纳值不能是引用类型,引用类型会出现编译错误。 获取std::optional容纳值时,一定要判断optional是否含值,含值则取其值,不含值时不要取其。...,获取不含值optional内值时会触发std::bad_optional_access异常。

7210

Swisstable:C++中比std::unordered_map更快hash表

Google实现这个hash表性能,请看下图:(图片引用了Zhihu 流左沙文章内图片)各种情况下,swisstable比std::unordered_set至少快两倍!!!...低负载情况高负载情况找到情况快2倍以上快6倍找不到情况快2.5倍快6倍对比std::unordered_maphash表通常号称O(1)时间复杂度,但是在hash冲突存在情况下,往往达不到O(1...)时间复杂度。...众所周知(我最喜欢问面试题),解决hash冲突有以下经典三种方式:开放地址法相邻地址法多散列函数法重点在于,std::unordered_map使用开放地址法来解决hash冲突。...链表最大问题就在于——在当代CPU架构下,内存比SSD快100倍,而cpu cache又比内存快100倍,链表对于CPU cache并不友好。因此,cache友好结构能够提升性能。

1.4K20

c++ lambda内std::move失效问题思考

为什么会造成这个问题呢, 我们需要结合std::move和lambda原理看下。...这也是本文问题所在。那么std::move实际上是做了什么事情呢?...结合本文最初问题,在lambda中move没有生效,显然也是std::move强转类型不是std::vector&&, 才导致了没有move成功。...那么这里问题就来了,当调用operator()时, 该闭包类所有的成员变量也是被const修饰,此时对成员变量调用std::move 将会引发上文提到,强转出来类型将会是**const string...我们最初问题lambda中std::move失效问题,也是因为这个原因。但这个也很符合const函数语义: const函数是不能修改成员变量值。 解决方案 那么,这个应该怎么解决呢?

3.9K30

C++11:基于std::unordered_map和共享锁构建线程安全map

https://blog.csdn.net/10km/article/details/52072061 前一篇博客《C++11:基于std::queue和std::mutex构建一个线程安全队列...都是独占访问,因为对threadsafe_queue中操作相对较少,而且主要操作push/pop都是写操作,所以这样做是没问题。...所以在实现线程安全map时,我没有选择使用std::mutex控制所有的操作为独占访问,而是用RWLock来控制map对象访问,RWLock是我以前自己写一个类,将线程对资源访问分为读取操作和写入操作两类...关于RWLock源码及更详细说明参见我博客《无锁编程:c++11基于atomic实现共享读写锁(写优先)》 有了RWLock,基于std::unordered_map实现线程安全map就比较简单了...{ private: std::unordered_map map; // 用于控制读写访问锁对象 mutable RWLock

8.6K10

踩坑一处(GCC)STL `std::async` 实现BUG导致crash问题

崩溃位置在STL std::future 析构地方,而这个 std::future 由 std::async创建。 比较违反直觉,这里记录分享一下分析和解决过程方面其他碰到小伙伴们。...问题分析 相关代码和规范 首先我们来看下相关代码: bool PeriodicExportingMetricReader::CollectAndExportOnce() { std::atomic<...由于栈上后构造对象先释放,所以这里lambda里引用了栈上变量也不会有什么问题。但是这里Crash了,那么我们来看看崩溃栈。...id=12683 这个问题只是偶现,所以可能和上面链接里前几个都无关,可能和最后一个线程安全边界条件有关。...实际上我参与开源社区 opentelemetry-cpp 时候也发下过几个 std::condition_variable 几处临界条件有问题地方,这个以后再分享。

14410

【C++】STL 容器总结 ( STL 各容器特点 | STL 个容器使用场景 | 单端数组容器 | 双端队列容器 | 双向链表容器 | 集合容器 | 多重集合容器 | 映射容器 | 多重映射容器 )

场景 ; 如果频繁增删元素 则 不适用该容器 ; 2、std::deque 双端队列容器 std::deque 双端队列容器特点 : 底层结构 : 底层由 双向队列 实现 , 特点是 存储空间 连续..., 需要将插入 / 删除位置之后元素依次改变位置 , 比 vector 动态数组要快一些 ; 空间效率 : 底层实现时比 vector 结构复杂 , 也会事先预留一些额外空间 , 以减少重新分配次数...排序规则 仿函数 ; 使用场景 : 需要 有序集合 且 元素 不重复 场景 ; 5、std::multiset 多重集合容器 std::multiset 多重集合容器特点 : 底层结构 : 底层由...std::map 映射容器特点 : 底层结构 : 底层由 红黑树 实现 , 红黑树 是 一种 平衡二叉搜索树 , 存储空间 不连续 ; 存储 元素 是 键值对 元素 ; 访问遍历 : 不支持 随机访问迭代器...元素 不重复 场景 ; std::map 映射容器 与 std::set 集合容器 区别是 map 容器存储是 键值对 元素 , 是 pair 对象 , set 容器 存储是 单纯 键 单个元素

2.5K10

C++ STL学习之【容器适配器】

,其结构特殊设计决定了它只适合于头尾操作需求高场景:双端队列 = vector + list,设计时就想汲取二者优点(下标随机访问 + 极致空间使用),但鱼和熊掌不可兼得,在复杂结构加持之下...作为主控数组(通过链式结构链接),数组中元素为数组指针 利用 vector 构造出大小为 N 小数组(缓冲区),这些小数组才是双端队列存储元素地方 注意: 此处 map 并非是容器 map,仅仅是名字相同而已...将二者结合起来,就得到了复杂双端队列 deque 扩容机制:只需要对中控数组 map 进行扩容,再将原 map数组指针拷贝过来即可,效率比较高 deque随机访问: (下标 -...这个迭代器还是一个随机迭代器,因此可以使用 std::sort 无论是 deque 还是 list,直接排序效率都不如借助 vector 间接排序效率高 deque 缺点 中间位置插入删除比较麻烦...,可以令小数组长度不同解决问题,不过此时影响随机访问效率 结构设计复杂,且不如 vector 和 list 极致 致命缺陷:不适合遍历,迭代器需要频繁检测是否移动某段小空间边界,效率很低 凑巧是,栈和队列

38830

【Example】C++ 标准库常用容器全面概述

需要注意问题: 迭代器非法化:指的是在 std::deque 逻辑上连续元素头尾与中间进行插入或删除新元素而导致迭代器失效。...是一个同时管理着索引区块与对应数据区块结构,它通过一个类似于 MAP Key:Value 形式来记录所拥有的内存区块。...每种适配器都限制了一些基础容器类功能,以便对标准数据结构提供精确控制接口。 stack 类支持) 数据结构后进先出 (后进先出。 可以在脑海中将其类比为一摞盘子。...std::stack std::stack 类是容器适配器,它给予程序员栈功能——特别是 FILO (先进后出)数据结构。 该类模板表现为底层容器包装器——只提供特定函数集合。...(抽象类)概念讲解及例子演示 【Example】C++ 虚基类与虚继承 (菱形继承问题) 【Example】C++ Template (模板)概念讲解及编译避坑 【Example】C++ 标准库 std

3.2K30

C++系列笔记(九)

这些内容被组织成结构合理、联系紧密章节,每章都可在1小时内阅读完毕,都提供了示例程序清单,并辅以示例输出和代码分析,以阐述该章介绍主题。本文是系列笔记第九篇,欢迎各位阅读指正!...STL提供关联容器包括: std::set——存储各不相同值,在插入时进行排序;容器复杂度为对数; std::unordered_set——存储各不相同值,在插入时进行排序;容器复杂度为常数。...这种容器是C++11新增std::map——存储键-值对,并根据唯一键排序;容器复杂度为对数; std::unordered_map——存储键-值对,并根据唯一键排序;容器复杂度为对数。...这种容器是C++11新增std::multimap——与map类似,但不要求键是唯一std::unordered_multimap——与unordered_map类似,但不要求键是唯一。...在很大程度上说,这种问题可以通过使用成员函数reserve (number) 来解决。reserve函数功能基本上是增加分配给内部数组内存,以免频繁地重新分配内存。

1K20

C++ 顺序容器基础知识总结

其中array与forward_list是C++11添加新容器类型。 2.std::array 2.1.底层数据结构 array底层数据结构是固定数组。...deque复杂迭代器架构,构建出了所有分段连续空间”整体连续“假象。 既然deque是由一段一段定长连续空间所构成,就需要有结构来管理这些连续空间。...deque采用一块map(非STL中map)作为主控,map是一块小连续空间,其中每个元素都是指针,指向一块较大线性连续空间,称为缓冲区。而缓冲区才是存储deque元素空间主体。...map本身也是一块固定大小连续空间,当缓冲区数量增多,map容不下更多指针时,deque会寻找一块新空间来作为map。...因此,尽管deque迭代器也是Ramdon Access Iterator 迭代器,但它实现要比vector复杂太多。SGI版本STL deque实现思路可以看侯捷《STL源码剖析》。

1.3K50

【C++】基础:STL标准库常用模块使用

STL介绍 C++标准模板库(Standard Template Library,STL)是C++中一个重要组成部分,提供了丰富容器、算法和函数模板,可以帮助开发人员快速实现通用数据结构和算法。...开发人员可以通过简单地调用这些算法,而无需自己实现复杂数据处理逻辑。 迭代器(Iterators): 迭代器是STL中用于遍历容器中元素抽象概念。...STL优点有: 1.可重用性:STL提供了通用数据结构和算法,可以在不同项目和场景中重复使用,避免了重复编写相似的代码。 2.高效性:STL中容器和算法都经过了优化,具有高效实现。...#include #include int main() { // 创建一个空deque容器 std::deque myDeque;...empty." << std::endl; } return 0; } map:映射,存储键值对,按照键大小进行自动排序。

9510
领券