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

如果2个元素的键彼此相等,std :: multimap会保留插入顺序吗?

如果2个元素的键彼此相等,std::multimap会保留插入顺序吗?

是的,std::multimap是一个关联容器,它允许多个元素具有相同的键。当插入具有相同键的元素时,std::multimap会保留它们的插入顺序。这是因为std::multimap内部使用平衡二叉搜索树(如红黑树)来存储元素,这种数据结构会保证元素的顺序。

例如,如果你有以下插入操作:

代码语言:cpp
复制
std::multimap<int, std::string> my_multimap;
my_multimap.insert({1, "one"});
my_multimap.insert({2, "two"});
my_multimap.insert({2, "two again"});
my_multimap.insert({3, "three"});

遍历std::multimap时,你将得到以下顺序:

代码语言:txt
复制
1 -> "one"
2 -> "two"
2 -> "two again"
3 -> "three"

这就是为什么std::multimap会保留具有相同键的元素的插入顺序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

STL之关联式容器(pair,tuple和multimap)

multimap 中会出现具有相同元素序列,它们会被添加到容器中。 3.1插入元素 multimap 容器成员函数 insert() 可以插入一个或多个元素,而且插入总是成功。...如果只使用 emplace() 来插入 "Mopsy",它可能会被插入到当前所有为 "rabbit" 元素后面。...返回 pair 对象成员变量 first 是一个迭代器,它指向第一个大于等于参数元素如果和参数相等元素存在的话,它是第一个和参数相同元素。...如果不存在,pair 成员变量 first 就是容器结束迭代器. lower_bound() 返回一个迭代器,它指向键值和参数相等或大于参数第一个元素,或者指向结束迭代器。...所以,当存在一个或多个相等时,这些函数返回一个开始迭代器和一个结束迭代器,它们指定了和参数匹配元素范围,这和 equal_range() 返回迭代器是相同

50340

【c++】set和map使用

2]; // 返回空字符串 在这个示例中,如果m中不存在2元素,那么创建一个新std::string对象(其值为默认构造空字符串),并将其与2关联。...multiset中元素按照特定顺序排列,默认情况下是使用元素类型 < 运算符来进行升序排列。 特性: 允许键值重复出现。 元素按照进行自动排序。 直接插入和删除元素具有对数复杂度。...在查找、删除或插入具有特定元素时,可能涉及到多个元素。...map 和 multimap成员函数,用于获取容器中与给定相等元素范围。...,或者如果给定不存在于容器中,则是指向给定上界 如果不存在与给定相等元素,则两个迭代器都会等于 upper_bound 对应迭代器,这意味着它们都会指向同一个位置,表示一个空范围。

4800
  • 【C++深度探索】map与set基础介绍与实用指南

    multiset中插入相等值,插入平衡二叉树左边右边都可以,因为旋转后,插入右边也可能旋转到左边,我们后续学习。...map容器是也基于平衡二叉树(红黑树)实现,所以插入、删除、查找等操作时间复杂度都是O( log_2 n ),并且在插入键值对时会根据顺序进行排序。...结果如下: 上图中,可以看出当m中没有相应"中"时,构造一个相应键值对插入m中。...erase删除元素: 删除为x元素如果有多个为x,那么会将为x全部删除,即使对应值不同。...键值对是根据大小进行排序,因此可以按照顺序进行遍历和访问。 multimap使用迭代器直接遍历multimap元素可以得到关于key有序序列。

    11510

    提升编程效率利器: 解析Google Guava库之集合篇Multimap(二)

    顺序保留也可不保留: Guava 提供了多种 Multimap 实现,其中一些实现可以保留元素插入顺序,如 LinkedHashMultimap,而另一些实现则不保证顺序,如 HashMultimap...,因此上述代码中输出可能根据插入和删除顺序而有所不同。...LinkedHashMultimap 如果你既需要快速查找性能,又希望保留插入顺序,那么 LinkedHashMultimap 是一个很好折中选择。...它结合了 HashMap 和 LinkedList 特点,既提供了快速查找性能,又保留元素插入顺序。 4....TreeMultimap 如果你需要按键顺序访问 Multimap元素,并且希望根据进行排序,那么 TreeMultimap 是一个很好选择。

    33110

    mapunordered_map基础用法

    由于映射中元素是唯一,因此插入操作将检查每个插入元素是否具有与容器中已有元素相同如果是,则不插入元素,并将迭代器返回给此现有元素如果函数返回一个值)。...在容器内部,map容器按照其比较对象指定标准,通过将所有元素进行排序。这些元素总是按照这个顺序插入到相应位置。...如果插入了新元素,则将pair中pair :: second元素设置为true;如果已存在相同,则将该元素设置为false。...2.带有提示(2)版本返回一个迭代器,指向新插入元素或映射中已经具有相同元素。 ...因为在执行“[]”操作过程中,插入失败返回与查找元素拥有相同key值一个iterator。

    2.6K30

    C++17,容器持续改进与统一访问

    ,C++17 改进了这些容器接口方法,现在你可以更加方便向容器中插入元素,合并或者移动一个容器元素至另一个"相似"容器中,并且新标准还统一了关联容器和顺序容器访问方式....::string)构造函数.之所以这个方法以try为前缀命名,是因为如果对应元素已经存在,该方法便不会执行实际添加操作.代码 (4) 处 insert_or_assign 方法则与 try_emplace...不同,如果对应元素已经存在,他会将新元素值赋值给已经存在元素(建立新键值对映射)....,拼接过程就是从 ordMap2 中抽取(extract)每一个键值对并插入 ordMap 中,如果 ordMap 中已经存在相同元素,则不会执行插入操作.整个过程不会发生键值对 copy 或者...当然,你也可以更改抽取节点插入回同一个关联容器中(A),或者直接不做任何更改(B).除了更改,你也可以更改节点值©. auto nodeHandle = multiMap.extract(2017

    63410

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

    如果出现冗余数据插入时,失败,如果想存储冗余数据,可以使用 multiset set 中常用功能 功能 用途 迭代器 遍历容器 empty 判断容器是否为空 size 当前容器中元素数 max_size...容器最大容量 operator[] 按照键值,访问实值,如果没有,则新插入 insert 元素插入,根据特定条件插入至合适位置 erase 删除指定元素 swap 交换两个容器 clear 清空容器中所有元素...map 不允许数据冗余,如果插入重复数据,可以使用 multimap map 插入返回值比 set 略微复杂,因为 既要表示是否成功,也要返回插入成功迭代器,所以返回值是一个 pair #include...交集,指两个数组中相同元素所构成集合 求交集步骤如下: 先将两个数组 排序 + 去重 遍历两个数组 如果相等,小 ++ 相等就是交集,记录下来 其中一方走完,所有交集就查找完了 排序 + 去重...至于差集查找,思路和交集差不多 求差集步骤如下: 先将两个数组 排序 + 去重 遍历两个数组 如果相等,同时 ++ 不相等,小一方记录后,再 ++ 其中一方走完,再遍历另一方,此时其中所有元素都是差集

    29320

    标准关联容器一定比vector查找速度快

    此时 size()返回 n,如果 n 小于当前大小,容器尾部元素会被销毁;n 大于当前大小,新默认构造元素添加到尾部;n大于当前容量,在元素加入之前会发生重新分配 4,reserve() 强制容器把它容量改为至少...了解相等和等价区别 /** 应用: 1,find查找第一个有特定值对象位置 :定义相等 基于 operator== 2,set::insert插入时会判断那个元素值是否已经在set中了 :...//而:如果你想要string* 指针以字符串值确定顺序被存储在 std::set中,不能使用默认比较仿函数 std::lessstd::string* //必须改为你自己比较仿函数类,它对象带有...条款19:避免原地修改set和multiset得 //1 //map 和multimap类型得对象中元素得类型是pair,因此K不能被改变(当然你使用...multimap而言,确定不要把副本地第一个元素声明为const,毕竟你要改变它 3,修改副本,使他有你想要在容器里地值 4,从容器里删除元素,通常用 erase 5, 把新值插入容器,如果元素在容器地排序顺序中地位置正好相同或相邻于删除地元素

    1.8K10

    【C++进阶学习】第六弹——set和map——体会用C++来构建二叉搜索树

    一、set与multiset概述 set 是一种关联容器,它存储唯一(不重复)元素,并且这些元素根据特定排序规则自动排序。...ms.insert(key); // multiset插入元素 insert 方法用于向set或multiset中添加元素如果插入成功,set insert方法返回pair<iterator, bool...如果允许集合中存在重复元素,那么应该选择multiset。 三、map和multimap 在C++STL(标准模板库)中,map和multimap是两种关联容器,它们用于存储键值对。...而multimap允许相同对应多个值,提供了一种更灵活数据存储方式。 排序:两者都按照自然顺序进行排序,通常为升序。可以通过自定义比较函数来改变排序规则。...基本操作 下面这些操作与上面set和multiset操作基本一致,就不再写了 构造与初始化:可以通过构造函数直接初始化map或multimap,也可以使用std::make_map或std::make_multimap

    11710

    【C++】STL 容器 - multimap 容器 ( multimap 容器简介 | multimap 容器常用操作 api - 插入 删除 修改 元素 )

    先后排列在一起 ; multimap 容器中元素 自动排序 , 默认情况下 , 使用 less 仿函数 排序规则 对 Key 进行比较排序 , 也可以自定义排序规则 ; 容器示例 : 下面的...二、multimap 容器常用操作 api 1、插入元素 multimap 容器插入元素 只能使用 insert 函数插入 , 不能使用 数组下标 方式 插入元素 ; 使用下面的 insert 函数插入元素...; iterator erase(const_iterator first, const_iterator last); 3、修改元素 由于 std::multimap 关联容器 中 Key...不是唯一 , 不能直接 通过成员函数 修改已有 键值对 元素 , 不能直接通过 Key 来定位并修改一个特定元素 ; 如果想要修改 Key 对应 某一个 值 Value , 只能 先找到这个...= myMap.end()) { // 修改找到元素值 it->second = "Purple"; } std::multimap#equal_range 函数 获取 迭代器

    28110

    STL学习笔记(11)常用容器 mapmultimap

    map/multimap 基本概念 Map 特性是,所有元素都会根据元素键值自动排序。...Map 所有的元素都是 pair,同时拥有实值和键值,pair 第一元素被视为键值,第二元素被视为实值,map 不允许两个元素有相同键值。 我们可以通过 map 迭代器改变 map 键值?...答案是不行,因为 map 键值关系到 map 元素排列规则,任 意改变 map 键值将会严重破坏 map 组织。如果想要修改元素实值,那么是可以。...6. map 查找操作 find(key); //查找 key 是否存在,若存在,返回该元素迭代器;若不存在,返回 map.end(); count(keyElem);...equal_range(keyElem); //返回容器中 key 与 keyElem 相等上下限两个迭代器。

    49010

    C++系列笔记(十一)

    std::pair来指定要插入和值:mapIntToString.insert(pait(1000,"One Thousand")); 在map或multimap查找元素 find...-值对容器std::unordered_map 要使用这个模板类,需要包含头文件#include unordered_map平均插入和删除时间是固定,查找元素时间也是固定...从使用角度看,这两种容器与std::map和std::multimap差别不大,可以类似的方式执行实例化、插入和查找。...不改变容器中元素顺序和内容算法称为非变序算法。变序算法改变其操作序列元素顺序或内容。 自适应容器   标准模板库(STL)提供了一些这样容器,即使用其他容器模拟栈和队列行为。...它是一个泛型类,允许在顶部插入和删除元素,而不允许访问中间元素。从这种角度看,std::stack行为很像一叠盘子。

    1.3K20

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

    需要将插入 / 删除位置之后元素依次改变位置 , O(n) 复杂度 ; 空间效率 : 底层实现时 , 事先预留一些额外空间 , 以减少重新分配次数 ; 使用场景 : 需要 随机访问 且 频繁在尾部进行操作..., 需要将插入 / 删除位置之后元素依次改变位置 , 比 vector 动态数组要快一些 ; 空间效率 : 底层实现时比 vector 结构要复杂 , 也事先预留一些额外空间 , 以减少重新分配次数...多重映射容器允许重复 ; 使用场景 : 需要 有序 键值对 且 元素 不重复 场景 ; std::map 映射容器 与 std::set 集合容器 区别是 map 容器存储是 键值对 元素..., 是 pair 对象 , set 容器 存储是 单纯 单个元素 ; 7、std::multimap 多重映射容器 std::multimap 多重映射容器特点 : 底层结构 : 底层由 红黑树...排序规则 仿函数 ; map 映射容器 不允许重复 , multimap 多重映射容器允许重复 ; 使用场景 : 需要 有序 键值对 且 元素 重复 场景 ; 二、STL 各容器特点总结

    3.1K10

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

    在某个元素插入元素 emplace_after 在元素后原位构造元素 erase_after 擦除元素元素 std::deque 双端队列,是具有下标与逻辑相邻顺序容器。...序列以允许查找、插入和移除任意元素方式表示,并包含与序列中元素数量无关多个操作(常量时间),至少在所有存储桶长度大致相等时如此。...基于红黑树 map 根据大小自动升序排序,基于哈希表则无序。 map 可以根据映射直接修改元素值。但是,却是常量无法修改,只能删除已有的键值对再添加新。...标准库当中 map 系列分为 std::map 和 std::multimap,前者不允许重复,后者则允许重复。...序列以允许查找、插入和移除任意元素方式表示,并包含与序列中元素数量无关多个操作(常量时间),至少在所有存储桶长度大致相等时如此。

    3.3K30

    C++系列笔记(九)

    标准模版库介绍 STL容器 顺序容器   顺序容器按顺序存储数据,如数组和列表。顺序容器具有插入速度快但查找操作相对较慢特征。...STL顺序容器包括: std::vector——操作与动态数组一样,在最后插入数据;可将vector视为书架,您可在一端添加和拿走图书; std::deque——与std::vector类似,但允许在开头插入或删除元素...这种容器是C++11新增std::map——存储-值对,并根据唯一排序;容器复杂度为对数; std::unordered_map——存储-值对,并根据唯一排序;容器复杂度为对数。...这种容器是C++11新增std::multimap——与map类似,但不要求是唯一std::unordered_multimap——与unordered_map类似,但不要求是唯一。...std::find_if:根据用户指定谓词在集合中查找值。 std::reverse:反转集合中元素排列顺序std::remove_if:根据用户定义谓词将元素从集合中删除。

    1K20

    STL总结与常见面试题

    find 在容器中搜索具有等于 k元素如果找到返回一个迭代器,否则返回 map::end count 在容器中搜索具有等于 k(参数)元素,并返回匹配数量 lower_bound 返回一个非递减序列...获取相同元素范围,返回包含容器中所有具有与 k等价元素范围边界 multimap multimap 特性以及用法与 map 完全相同,唯一差别在于它允许键值重复,因此它插入操作采用是底层机制...如果第一个序列在字典序中小于第二个序列,则返回 true。否则,返回 fa1se。如果个序列比另一个短,且所有元素都与较长序列对应元素相等,则较短序列在字典序中更小。...如果序列长度相等,且对应元素相等,则在字典序中任何一个都不大于另外一个。...map 、set、multiset、multimap特点 set和multiset根据特定排序准则自动将元素排序,set中元素不允许重复,multiset可以重复。

    3.6K98

    C++(STL):35---multimap容器

    其中各个键值对值不能做修改;并且,该容器也自行根据大小对存储所有键值对做排序操作。...如果程序中已经默认指定了 std 命令空间,这里可以省略 std::。...如果 multimap 容器用 const 限定,则该方法返回是 const 类型双向迭代器。 rbegin() 返回指向最后一个(注意,是已排好序最后一个)元素反向双向迭代器。...如果 multimap 容器用 const 限定,则该方法返回是 const 类型反向双向迭代器。 rend() 返回指向第一个(注意,是已排好序第一个)元素所在位置前一个位置反向双向迭代器。...insert() 向 multimap 容器中插入键值对。 erase() 删除 multimap 容器指定位置、指定(key)值或者指定区域内键值对。

    1K20

    STL总结与常见面试题

    find 在容器中搜索具有等于 k元素如果找到返回一个迭代器,否则返回 map::end count 在容器中搜索具有等于 k(参数)元素,并返回匹配数量 lower_bound 返回一个非递减序列...获取相同元素范围,返回包含容器中所有具有与 k等价元素范围边界 multimap multimap 特性以及用法与 map 完全相同,唯一差别在于它允许键值重复,因此它插入操作采用是底层机制...如果第一个序列在字典序中小于第二个序列,则返回 true。否则,返回 fa1se。如果个序列比另一个短,且所有元素都与较长序列对应元素相等,则较短序列在字典序中更小。...如果序列长度相等,且对应元素相等,则在字典序中任何一个都不大于另外一个。...map 、set、multiset、multimap特点 set和multiset根据特定排序准则自动将元素排序,set中元素不允许重复,multiset可以重复。

    67230

    STL总结与常见面试题+资料

    find 在容器中搜索具有等于 k元素如果找到返回一个迭代器,否则返回 map::end count 在容器中搜索具有等于 k(参数)元素,并返回匹配数量 lower_bound 返回一个非递减序列...获取相同元素范围,返回包含容器中所有具有与 k等价元素范围边界 multimap multimap 特性以及用法与 map 完全相同,唯一差别在于它允许键值重复,因此它插入操作采用是底层机制...如果第一个序列在字典序中小于第二个序列,则返回 true。否则,返回 fa1se。如果个序列比另一个短,且所有元素都与较长序列对应元素相等,则较短序列在字典序中更小。...如果序列长度相等,且对应元素相等,则在字典序中任何一个都不大于另外一个。...map 、set、multiset、multimap特点 set和multiset根据特定排序准则自动将元素排序,set中元素不允许重复,multiset可以重复。

    56320
    领券