在 boost::unordered_multimap 中循环遍历 equal_range

Posted

技术标签:

【中文标题】在 boost::unordered_multimap 中循环遍历 equal_range【英文标题】:Loop through equal_range in a boost::unordered_multimap 【发布时间】:2016-11-14 10:22:32 【问题描述】:

我正在尝试学习如何遍历从具有相同键的 boost::unordered_multimap 返回的值。所以,我做到了,

boost::unordered_multimap<string, string> sample;

我可能有,

<"one", "1">,

<"one", "11">,

<"two", "2">,

<"three", "3">,

<"three", "3">,

<"three", "33">,

<"three", "333">,

我尝试获取与“两个”对应的值,所以我这样做了,

std::pair<boost::unordered_multimap<string, string>::iterator, boost::unordered_multimap<string, string>::iterator> > ret = sample.equal_range("two");

我像这样迭代它,

for(boost::unordered_multimap<string, string>::iterator> it = ret.first ; it != ret.second; it++)

    cout<<"The values mapped are : "<<*it->second<<"\n";

我会得到值:2,因为这是唯一映射的值?我会第一次跳出循环吗?我正在尝试在线/关于提升文档的答案,但我没有成功。这可能是一个基本问题,但我正在努力学习。任何帮助将不胜感激。

TIA

-R

【问题讨论】:

【参考方案1】:

关于boost:equal_range(key& vkey):

用法:

std::pair<iterator, iterator> Equal_Range = Unordered_Map.equal_range("key"); 

返回:

映射表包含 KEY: key 的所有映射结果。 Equal_Range.first 代表结果表中的第一个位置,而Equal_Range.second 代表最后一个。 特殊情况:如果只匹配一个元素,ret.first 指向key 映射的位置,ret.second 指向原始地图上的最后一个位置:original_map.last

所以通过使用equal_range(key&amp; vkey),您已经获得了结果表std::pair&lt;itr1, itr2&gt;,其中存储了您找到的所有映射结果,itr1vkey 映射的第一个位置,而itr2 代表最后一个。所以你的代码工作正常:

for(auto Itr = ret.first; Itr != ret.second; ++Itr)
        std::cout << "The values mapped are : " << Itr->second << std::endl;

测试用例: key = "three"

The values mapped are : 3
The values mapped are : 3
The values mapped are : 33
The values mapped are : 333

【讨论】:

我不确定我只映射了一个值,我可能映射了两个、三个或 n 个值。所以一个循环将是我的选择。我想知道在调用 equal_range 并遍历返回对之后,是否可以将所有值映射到它,包括最后一个 .. 检查我的编辑 是的,谢谢。我试过了,它有效。我明白,但我想了解如果只有一个值映射到关键元素,这是如何工作的。从 equal_range 调用返回的 ret 就像 ret.first 将等于 ret.last ,所以根本不应该进入循环吗?这是如何工作的,这是我的困惑。 哦,好的。但是,如果 ret.first 是键映射的位置,而 ret.second 指向 sample 上的第一个位置(这将是 ),那将如何工作?您的意思是 ret.second 将指向密钥的第一次(也是唯一一次)之前的位置吗?另外,如果是这种情况, unordered_map 没有以任何特定方式排列,对吧?这将如何运作? 我的错误,如果只有一个匹配,ret.second 指向样本中的最后一个元素。

以上是关于在 boost::unordered_multimap 中循环遍历 equal_range的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据