C++ 使用其值访问密钥

C++ 使用其值访问密钥,c++,stdmap,C++,Stdmap,我使用的是std::map,其中键和值的类型均为int且唯一: std::map <int, int> myMap; myMap[21] = 13; 它将返回21。没有有效的方法 您可以为键值对创建一个带有std::map的包装类,为值键值对创建一个std::multimap(或者如果可以保证值是唯一的,则创建一个std::map)的包装类。这比下一个解决方案效率更高,但占用的内存增加了2倍 以下内容不使用任何额外内存,但对于映射,它是O(N)而不是O(logn): const i

我使用的是
std::map
,其中键和值的类型均为
int
且唯一:

std::map <int, int> myMap;
myMap[21] = 13;

它将返回21。

没有有效的方法

您可以为键值对创建一个带有
std::map
的包装类,为值键值对创建一个
std::multimap
(或者如果可以保证值是唯一的,则创建一个
std::map
)的包装类。这比下一个解决方案效率更高,但占用的内存增加了2倍

以下内容不使用任何额外内存,但对于映射,它是O(N)而不是O(logn):

const int compare = 13;
auto it = std::find_if(myMap.cbegin(), myMap.cend(), [compare](const auto& value) {
    return value.second == compare;
});

if (it != myMap.cend())
    ; // found key

为什么要将值映射回键?简而言之,我将实际节点ID映射为键,将虚拟节点ID映射为大型图的值。大多数情况下,我需要通过钥匙访问它。但在某个时刻,我需要访问密钥。如果我可以通过值来访问它,我就不需要维护另一个额外的数组来执行某些操作。因此,基本上,如果可能的话,我只需要通过值来访问它,而不需要将值映射回键。
const int compare = 13;
auto it = std::find_if(myMap.cbegin(), myMap.cend(), [compare](const auto& value) {
    return value.second == compare;
});

if (it != myMap.cend())
    ; // found key