当映射中已知值时获取键的最佳方法
Best way of obtaining a key when a value is known in a map
>假设我有一张这样的地图
std::map<std::string,in> mp;
mp["KeyA"] = 1;
mp["KeyB"] = 2;
mp["KeyD"] = 3;
mp["KeyF"] = 4;
现在,当我有一个已知的值时,我需要获取密钥,例如,如果我有 1,我想获取 KeyA。我唯一的想法是我需要遍历整个地图,一旦找到一个值,然后返回键。例如,psudocode解释了我的方法。
for(std::map<std::string,in>::iterator it = mp.begin();i<mp.end;++i)
{
if(it->second == somevalue)
{
return it->first;
}
}
我想知道是否有更快或更好的方法来实现这一目标
通常,
当您想要反向查找时,您有两个映射:一个从键到值,另一个从值到键。 如果您的值不是唯一的,则反向映射需要是一个std::multimap
。
如果您不打算从地图中更改或移除值,则这是最容易管理的。
如果您不需要反向地图,则需要遍历整个地图才能找到该值。
建立在 Paddy 的答案之上...
typedef std::map<std::string, int> MyMap;
typedef std::multimap<MyMap::mapped_type, MyMap::key_type> InvMap;
typedef InvMap::value_type InvElement;
typedef std::pair<InvMap::iterator, InvMap::iterator> FoundRange;
MyMap myMap;
InvMap invMap;
myMap["foo"] = 1;
myMap["bar"] = 1;
myMap["baz"] = 2;
for (auto it = myMap.begin(), end = myMap.end(); it != end; ++it)
invMap.insert(InvElement(it->second, it->first));
// Contains begin and end iterators to range of elements found.
FoundRange range = invMap.equal_range(1);
int count = std::distance(range.first, range.second);
printf("Found %i matching value 1", count);
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 获取 exe 文件夹路径的最佳方法?
- 在 c++ 中获取常量字符 * 长度的最佳方法
- 填充字符数组的最佳方法(获取与cin.getline)
- 获取数字小数部分的最佳方法
- 获取地图值作为向量的最佳方法是什么
- 在Windows中获取安装前缀的最佳方法是什么
- 从向量中获取n个最佳元素
- 获取私有实例变量容器成员值的最佳方式
- C++:通过进程id、进程句柄和标题名称从进程中获取唯一窗口的窗口句柄的最佳方法
- 如何以最佳方式将字节数组从 C# 获取到C++ WinRT 组件
- 当映射中已知值时获取键的最佳方法
- c++:在泛型代码中获取对象大小的最佳方法
- 在可能失败的函数中重新获取对象引用的最佳方法
- 使用fstream从文件中获取最后一个字节的最佳方法