首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++】STL 容器 - map 关联容器 ① ( std::map 容器简介 | std::map 容器排序规则 | std::map 容器底层实现 )

执行结果 一、std::map 容器 1、std::map 容器简介 std::map 容器 是 C++ 语言 标准模板库 ( STL , Standard Template Library ) 提供的...对应 值 Value ; std::map 容器 的 大小 是 动态调整的 , 在 运行时 增加 / 删除 键值对元素 , 其大小也随之变化 ; 使用 map 集合之前 , 需要导入 头文件...容器必须制定排序规则 , 默认就是 less 排序规则 , 使用该规则的前提是 元素类型可以使用 < 操作符进行运算 , 如果不能进行 < 运算 , 则必须传入一个排序规则 ; 3、std::map...容器底层实现 std::map 容器 底层使用 红黑树 实现 , 这是 平衡二叉树 的变体 数据结构 ; std::map 容器 与 std::set 容器 底层实现相同 , 区别是 map 容器中存储的是键值对..., set 容器中存储的事单个元素值 ; 使用 红黑树 实现的 std::map 容器 和 std::set 容器 , 其 插入 / 删除 操作 比 线性表 性能要高 ; 线性表 的 插入 / 删除

73110

C++ map内部算法1

字符串经常被用来作为键,如果想要保存姓名和地址的记录,就可以这么使用。名称通常可能是一个或多个字符串。...图 1 map容器的概念展示图 图 1 表示的是 map 类型的容器,其中的 Name 类可以这样定义: class Name{private: std::string...firstname{}; std::string secondname{};public: Name(std::string first, std::string second) : firstname...不要因为 map 使用 less 对元素排序就被误导,这些元素并没有被组织成一个简单的有序序列,STL map 容器对元素的组织方式并没有具体要求,但元素一般都会保存在一个平衡二叉树中。...图 2 展示了图 1 所表示的 map 容器可能的平衡二叉树。 ? 图 2 map 容器的内部组织图 图 2 所示的树有 3 层,所以从根节点开始,找到任意的元素最多需要 3 步。

1K10
您找到你想要的搜索结果了吗?
是的
没有找到

C++ std::optional 使用教程

1. std::optional 是什么 C++ 17 引入了std::optional,表示一个可能有值的对象(没有值时就是默认的std::nullopt),例如这个例子中,std::optional...为什么要引入 std::optional 我觉得提出std::optional就是因为C++底层缺少None 这个表示,所以将std::nullopt和某种特定类型的变量合并在一起构造成一个std::optional...使用这个函数时也只需要判断一下返回值是否为std::nullopt 就可以。 总之可以将std::optional对象当作支持判断是否为NULL的对象的封装,在不确定对象是否存在的情况下,建议使用。...::cout << val1.value() << std::endl; 每次调用emplace 时,会清除掉之前的值,因此可以多次调用,且能保证每次都是最新的数值。...std::bad_optional_access: bad_optional_access 所以建议使用.value_or来处理,如果要强行使用.value的话,需要使用 try-catch 语句:

33941

高效的使用stl::mapstd::set

1、低效率的用法 // 先查找是否存在,如果不存在,则插入 if (map.find(X) == map::end()) // 需要find一次 {     map.insert(x); // 需要find...一次 } // 下面这段代码是一个意思 if (0 == map.count(X) // 需要find一次 {     map.insert(x); // 需要find一次 } // 或者是先判断是否存在...,如果不存在则插入,反之如果存在则修改 if (map.count(X) > 0) // 需要find一次 {     map.erase(X); // 需要find一次 } map.insert(x)...; // 需要find一次 // 对于erase存在同样低效的用法 if (map.count(X) > 0) // 需要find一次 {     map.erase(X); // 需要find一次 }...else {     // 不存在时的处理 } 2、高效率的用法 // 解决办法,充分利用insert和erase的返回值,将find次数降为1 map::size_type num_erased =

2.9K20

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

这个算法由google开源,最早在2017年的c++大会上分享过。...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冲突。...状态位分为:未使用:0xFF表示(全为1)已删除:0x80表示(最高位为1,其余位为0)在使用:0x00~0x7F之间的值(最高位为1)group概念以128bit对齐的连续8字节的control byte

1.4K20

map 学习(上)——C++map使用

map 学习(上)——C++map使用 欠下数据结构的债,迟早是要还的…… 最近写毕业论文过程中,需要用到哈希表的数据结构,此外空闲时间在刷 Leetcode 过程中,发现好多高效算法都是用 unordered_map...本篇先学习 C++ 中 STL 标准库中 map使用方法。...内部的元素通常按照其 Key 值排序,且排序方式是根据某种明确、严格的弱排序标准进行的,这种排序标准是由 map 内部的比较对象(即 map::key_comp)指定的。...map 中的映射值可以使用括号运算符 (operator[]) 通过其关联的 Key 值直接访问。 map 通常使用二叉搜索树实现。...别名为成员类型 map::allocator_type 五、常用函数 构造函数 在后续的程序示例中展示了五种不同的构造函数; clear 清除 map 中所有元素; erase 删除 map 中指定位置的元素

3K60

C++map和set的使用

内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则(不允许存在相同的关键字)进行排序。...在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则 进行排序。...在内部map中的元素总是按照键值key进行比较排序的。...,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递) 5.2 map使用 5.2.1 构造函数 (1)空map (2)迭代器区间构造map (3)...但是c++中提供了一个make_pair的接口 本质上也是去调用这个匿名构造,但是我们的代码可以更加简洁。 他可以帮助我们自动识别类型。

9010

C++【set 和 map 学习及使用

1.3、树型结构的关联式容器 所以在 C++ 标准中,共提供了四种 树型结构的关联式容器 set multiset map multimap 关于 哈希结构的关联式容器 将在 哈希表 中学习 树型结构与哈希结构的关联式容器功能都是一模一样的...实值 在 map 中会用到前面提到过的 pair 结构,其中 first 表示键值,second 表示实值 map 也有迭代器,也是 双向迭代器 3.2、map使用 构造 map 有以下几种方法... #include #include #include using namespace std; int main() { map...+ multimap 这个解法就有点狠了,直接使用 map 与 multimap 互导,完成排序 map 按照字典序排序,并统计出频率 multimap 在 map 的基础上,按照 频率 排序 注意...+【set 和 map 学习和使用】的全部内容了,在这篇文章中我们先学习了 关联式容器相关知识,然后学习了 set、multiset、map 以及 multimap 的使用,最后通过一些题目见识到了 set

24720

C++map使用方法

C++中的mapmap的介绍map是一种使用键值对的数据结构,它允许我们使用键来查找值。map中的键必须是唯一且有序的,而值可以重复并且没有特定的顺序。...创建和初始化map我们可以使用C++标准库中的map头文件来创建和初始化一个map。...最后,我们使用迭代器遍历该map并输出每个键值对。我们还可以使用初始化列表来初始化map。...以下示例展示了如何使用初始化列表来创建并初始化一个mapmap myMap { {"apple", 1}, {"banana", 2}, {"cherry"...然后,我们使用lower_bound()和upper_bound()方法查找键值在范围内的元素。最后,我们遍历找到的元素并输出它们的键值对。总结:在本文中,我们了解了C++中的map

25700
领券