2016-06-10 94 views
1

值假設我有以下幾點:搜索多地圖

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的一個很好的方式?

回答

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

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

另一種替代的解決方案可能是使用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);