如何按值而不是键在容器中查找对象
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::map
或 std::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;
}
你应该知道这是一个线性时间算法(不管地图是否有序),因此如果这是一个你会经常使用的操作,你应该考虑它是否会最好也只存储逆映射。
我有一个 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::map
或 std::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;
}
你应该知道这是一个线性时间算法(不管地图是否有序),因此如果这是一个你会经常使用的操作,你应该考虑它是否会最好也只存储逆映射。