如何按值而不是键在容器中查找对象

How to find object in container by value, not key

我有一个 map<int, int*>

我想在 map 中搜索 特定值(不是键) 并检索指向正确 int* (值地图)

我可以使用 std::find_if() 吗?

auto it = std::find_if(map.begin(), map.end(), compare);

比较应该是这样的:

bool compare(int* v1, int* v2)
{
 return (v1==v2);
}

完成此任务的最佳方法是什么?

你可以这样做:

#include <string>                                                                                                                                                                                                                           
#include <iostream>
#include <algorithm>
#include <map>

int main()
{
    std::map<int, std::string> m = {{1, "a"}, {2, "b"}};
    std::string value_to_find = "b";
    auto it = std::find_if(m.begin(), m.end(), [&](decltype(m)::value_type &v) {
        return v.second == value_to_find;
    });

    if (it != m.end()) {
        std::cout << it->first << std::endl;
    }
    return 0;
}

您可以直接使用模板实例代替 decltype()

[&](std::map<int, std::string>::value_type &v)

std::find_if 将为任何 'map-like' 类型完成工作,例如std::mapstd::unordered_map。请注意,该系列 不需要 需要订购;任何定义 InputIterator(即 'iterable')的东西都可以。

这是一个适用于任何东西的函数 'map-like'(但不适用于 'multimap-like')

template <typename MapType>
typename MapType::const_iterator find_value(const MapType& map, const typename MapType::mapped_type& value)
{
    return std::find_if(std::cbegin(map), std::cend(map), [&value] (const auto& p) { return p.second == value; });
}

int main(int argc, const char **argv)
{
    std::unordered_map<int, char> map {{0, 'A'}, {1, 'B'}, {2, 'C'}};
    char val {'B'};
    auto it = find_value(map, val);
    if (it != std::cend(map)) std::cout << it->first << std::endl;
    return 0;
}

你应该知道这是一个线性时间算法(不管地图是否有序),因此如果这是一个你会经常使用的操作,你应该考虑它是否会最好也只存储逆映射。