执行结果 一、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 容器 , 其 插入 / 删除 操作 比 线性表 性能要高 ; 线性表 的 插入 / 删除
字符串经常被用来作为键,如果想要保存姓名和地址的记录,就可以这么使用。名称通常可能是一个或多个字符串。...图 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 步。
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 语句:
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 =
-- 清理map缓存 --> com.test.utils.sms.CacheMap 监听类...// 服务启动、初始化时执行------60分钟一次 int minutes = 60; int second = 60; int timeDistance = 1000; // 使用定时类...每隔一段时间执行 //System.out.println("start++++++++++"); } } public void clearRandomMap() { // 清除...map过期的key List list = new ArrayList(); Iterator iter = VerifyCodeManager.codes.keySet...String key = iter.next().toString(); InnerCode val = VerifyCodeManager.codes.get(key); // 设计很巧妙:使用时间比较大小返回真假
-- 清理map缓存 --> com.test.utils.sms.CacheMap ...// 服务启动、初始化时执行------60分钟一次 int minutes = 60; int second = 60; int timeDistance = 1000; // 使用定时类...每隔一段时间执行 //System.out.println("start++++++++++"); } } public void clearRandomMap() { // 清除...map过期的key List list = new ArrayList(); Iterator iter = VerifyCodeManager.codes.keySet...String key = iter.next().toString(); InnerCode val = VerifyCodeManager.codes.get(key); // 设计很巧妙:使用时间比较大小返回真假
这个算法由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
参考链接: 通过引用进行C++调用:使用指针[包含示例] 这是c++11新添加的,头文件#include 官方说明: Class template std::function...Instances of std::function can store, copy, and invoke any Callable target -- functions, lambda expressions...The stored callable object is called the target of std::function....If a std::function contains no target, it is called empty....Invoking the target of an empty std::function results in std::bad_
今天在使用Modbus读取设备对应寄存器的float状态值时,出现一些问题,导致数据不能正常获取,最后发现原来设备对应的寄存器里面会出现一些无效的值,导致读取显示出错,没做容错判断处理。...std::numeric_limits::quiet_NaN 。...std::boolalpha << "isnan(NaN) = " << <em>std</em>::isnan(NAN) << '\n' << "isnan(Inf...) = " << <em>std</em>::isnan(INFINITY) << '\n' << "isnan(0.0) = " << <em>std</em>::isnan(0.0) << '\n'..." << std::isnan(0.0/0.0) << '\n' << "isnan(Inf - Inf) = " << <em>std</em>::isnan(INFINITY - INFINITY
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 中指定位置的元素
对于STL容器来说,有很多相似的功能,所以这里主要将与之前不同的功能说清楚 @TOC 1.对于set与map的简单理解 vector/list/deque 作为序列式容器(类似于线性表的存储方式) map...set作为关联式容器,里面存储的是结构的键值对(数据之间有非常强的关联关系) 键值对:用来表示一 一对应的关系,key代表键值,value代表与key对应的信息 如:中英文互译字典,内部的英文必然有一个中文对应...---- map与set 底层是二叉搜索树 ---- set作为key模型 map作为 key_value模型 不懂的可以点击了解:二叉搜索树的应用场景 2. set set的官方文档 ---- compare
在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则(不允许存在相同的关键字)进行排序。...在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则 进行排序。...在内部,map中的元素总是按照键值key进行比较排序的。...,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递) 5.2 map的使用 5.2.1 构造函数 (1)空map (2)迭代器区间构造map (3)...但是c++中提供了一个make_pair的接口 本质上也是去调用这个匿名构造,但是我们的代码可以更加简洁。 他可以帮助我们自动识别类型。
; 在内部,map中的元素总是按照键值key进行比较排序的。...map初始化列表使用: mapdict2 = { {"banana", "香蕉"},{"left", "左边"} }; 我们遍历上面的dict: 错误方法: auto it...这些键值对在 map 内部被存储为 std::pair 类型的对象。...实际上,operator[]内部会进行一些优化来避免不必要的元素创建,但上述代码段提供了逻辑上等效于operator[]所做工作的概念性说明 对于 std::map 的 insert 方法,当你尝试插入一个新元素时...在 topKFrequent 函数中: 使用一个 std::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
CP.21: Use std::lock() or std::scoped_lock to acquire multiple mutexes CP.21:使用std::lock()或者std::scoped_lock...lck2(m2); // thread 2 lock_guard lck2(m2); lock_guard lck1(m1); Instead, use lock(): 使用
C++中的mapmap的介绍map是一种使用键值对的数据结构,它允许我们使用键来查找值。map中的键必须是唯一且有序的,而值可以重复并且没有特定的顺序。...创建和初始化map我们可以使用C++标准库中的map头文件来创建和初始化一个map。...最后,我们使用迭代器遍历该map并输出每个键值对。我们还可以使用初始化列表来初始化map。...以下示例展示了如何使用初始化列表来创建并初始化一个map:map myMap { {"apple", 1}, {"banana", 2}, {"cherry"...然后,我们使用lower_bound()和upper_bound()方法查找键值在范围内的元素。最后,我们遍历找到的元素并输出它们的键值对。总结:在本文中,我们了解了C++中的map。
(图片来源于网络) 一、set 1.1 set特点介绍 set的介绍 C++中的set是一个STL容器,它是一个自动排序的集合(即将数据存入set,我们通过迭代器顺序访问出来时,数据是有序的),内部使用红黑树...(auto it : map1) { cout << it.first << it.second << endl; } cout << endl; // 使用初始化列表构造...banana香蕉 orange橘子 map3: 2 monkey3 panda1 空格对应的值:2 [ ]的作用 在 C++ 中,map 中的 [] 运算符可以用于访问和修改...void test() { std::map my_map; my_map["apple"] = 2; my_map["banana"] =...std::cout << my_map["pear"] << std::endl; // 输出默认值 0 cout << "my_map 变化后" << endl; for
可以同故宫调用STL里面的map来解决这个问题。 map关联集合的本质也是一棵红黑树,可以看做一个下标可以是任意类型的数组。...头文件是map:#include 常用方法 1)map ds 建立一个名为ds、下标类型为A,元素类型为B的映射表,例如 map 就是一个将string...ds.end() 6)ds.empty() 如果映射表为空,则返回1,否则返回0 7)ds.size() 返回映射表中的元素个数 8)ds.erase(A) 删除这个”数组”中下标为A的元素 注意:在使用...successfully Not found 0 解题代码: #include #include #include #include using namespace std; int n,opt,score; string name; map ds; int main(){ cin>>n; while(
树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树) 作为其底层结果,容器中的元素是一个有序的序列。...在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。...set的模板参数列表 T: set中存放元素的类型,实际在底层存储的键值对。...在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则进行排序。...在内部,map中的元素总是按照键值key进行比较排序的。
领取专属 10元无门槛券
手把手带您无忧上云