在多地图中搜索值
Search for value in multi map
假设我有以下内容:
class Foo {
public:
Foo(int x) {
_x = x;
}
int _x;
}
int main() {
multimap<string, Foo> mm;
Foo first_foo(5);
Foo second_foo(10);
mm.insert(pair<string, Foo>("A", first_foo));
mm.insert(pair<string, Foo>("A", second_foo));
Foo third_foo(10);
}
检查 third_foo
键 "A"
是否已经在我的 multimap
中的好方法是什么?
使用 multimap::equal_range
to fetch a range of iterators to entries that have the key "A"
. Then use any_of
检查这些值是否与您想要的 Foo
相比较。
auto const& r = mm.equal_range("A");
bool found = std::any_of(r.first, r.second,
[&third_foo](decltype(mm)::value_type const& p) {
return p.second._x == third_foo._x;
});
std::find
可用于在任何容器中查找可迭代的对象。
在您的代码中,它看起来像这样:
auto it = std::find(mm.begin(), mm.end(), std::pair<string, Foo>("A", third_foo));
if (it == mm.end())
// third_foo is not in the multimap
else
// third_foo is in the multimap
为此,您必须将 operator ==
添加到 Foo
或使用带有 std::find_if
的谓词。这会将您的调用更改为如下所示:
auto it = std::find_if(mm.begin(), mm.end(),
[&third_foo](auto v)
{
return v.second._x == third_foo._x;
});
另一种替代解决方案可能是使用 lower_bound
和 upper_bound
方法,在 lambda 中立即为:
bool found = [mm](const string& key,int expectVal) {
auto ub = mm.upper_bound(key);
return (find_if(mm.lower_bound(key),ub,[expectVal](auto p){ return p.second._x==expectVal; }) != ub);
}("A",third_foo._x);
假设我有以下内容:
class Foo {
public:
Foo(int x) {
_x = x;
}
int _x;
}
int main() {
multimap<string, Foo> mm;
Foo first_foo(5);
Foo second_foo(10);
mm.insert(pair<string, Foo>("A", first_foo));
mm.insert(pair<string, Foo>("A", second_foo));
Foo third_foo(10);
}
检查 third_foo
键 "A"
是否已经在我的 multimap
中的好方法是什么?
使用 multimap::equal_range
to fetch a range of iterators to entries that have the key "A"
. Then use any_of
检查这些值是否与您想要的 Foo
相比较。
auto const& r = mm.equal_range("A");
bool found = std::any_of(r.first, r.second,
[&third_foo](decltype(mm)::value_type const& p) {
return p.second._x == third_foo._x;
});
std::find
可用于在任何容器中查找可迭代的对象。
在您的代码中,它看起来像这样:
auto it = std::find(mm.begin(), mm.end(), std::pair<string, Foo>("A", third_foo));
if (it == mm.end())
// third_foo is not in the multimap
else
// third_foo is in the multimap
为此,您必须将 operator ==
添加到 Foo
或使用带有 std::find_if
的谓词。这会将您的调用更改为如下所示:
auto it = std::find_if(mm.begin(), mm.end(),
[&third_foo](auto v)
{
return v.second._x == third_foo._x;
});
另一种替代解决方案可能是使用 lower_bound
和 upper_bound
方法,在 lambda 中立即为:
bool found = [mm](const string& key,int expectVal) {
auto ub = mm.upper_bound(key);
return (find_if(mm.lower_bound(key),ub,[expectVal](auto p){ return p.second._x==expectVal; }) != ub);
}("A",third_foo._x);