首页
学习
活动
专区
工具
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

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.3K20

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.5K10

【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 容器 存储是 单纯 键 单个元素

1.9K10

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

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

36130

【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 标准模板库(容器总结)算法

,该容器可以方便、灵活地代替数组,容器可以实现动态对数组阔扩容删除等各种复杂操作,其时间复杂度O(l)常数阶,其他元素插入和删除为O(n)线性阶,其中n为容器元素个数,vector具有自动内存管理机制...#include #include using namespace std; int main(int argc, char* argv[]) { deque...,不同于采用线性表顺序存储结构Vector和Deque容器,双向链表中任一位置元素,查找,插入和删除,都具有高效常数阶算法时间复杂度O(1)....这个结构体中所有数据..../Multimap 序列容器 Map映射容器属于关联容器,它每个键对应着每个值,容器数据结构同样采用红黑树进行管理,插入键不允许重复,但值是可以重复,如果使用Multimap声明映射容器,则同样可以插入相同键值

2.2K10

基于STL源码分析deque容器整体实现及内存结构

本篇文章基于gcc中stl源码介绍deque容器整体实现和它内存结构。 说明一下,我用是gcc7.1.0编译器,标准库源代码也是这个版本。 首先呢,还是看一下思维导图,如下: ?...下面对这个类图进行一个简单解读: deque容器保护继承于类模板_Deque_base,也就是_Deque_base是deque基类,并且内存分配和释放都是通过基类来完成; 容器首地址和迭代器等保存在结构体成员变量...2. deque容器构造时内存结构是怎样 在源代码里面,deque容器构造函数重载了很多,我们选取其中一种典型类型看一下,构造函数原型如下: //构造一个大小为ndeque容器,容器中所有元素值为..._M_map_size = std::max((size_t) _S_initial_map_size, size_t(__num_nodes + 2));...上图中node代表节点,这些节点是一段连续内存,每一个节点指向一块独立buffer,从数据结构层面讲,deque容器其实就是一个双端队列。

58440

【c++】标准模板库STL入门简介与常见用法

2、容器(Containers) 容器类是可以包含其它对象模板类,如向量类(vector)、链表类(list)、双向队列类(deque)、集合类(set)和映射类(map)等。...其中vector、list、deque为序列式容器,set、map为关联式容器。...每个分量是int vector v; //向量v,每个分量是point list L1;    //链表L1,每个节点是int 3、算法(Algorithms) STL提供了非常多数据结构算法..."               << c3.size() << std::endl ;        return 0 ; } 六、map技术 1、map概述 map是一种关联式容器,set中每个元素都是由...2、map成员函数 (1)构造函数: map m2; // 创建一个名为m2map对象,其键和值类型分别为k和v map m(m2); // 创建m2副本m,m与m2必须有相同键类型和值类型

68810
领券