在多地图中搜索值

时间:2016-06-10 23:02:06

标签: c++ c++11 multimap

假设我有以下内容:

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的{​​{1}}是否已在我的"A"中,这是一种很好的方法吗?

3 个答案:

答案 0 :(得分:2)

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;
    });

答案 1 :(得分:1)

使用multimap::equal_range将一系列迭代器提取到具有键"A"的条目。然后使用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;
                         });

答案 2 :(得分:0)

另一种替代解决方案可能是在一个简单的lambda中使用lower_boundupper_bound方法:

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);