是否可以在multimap中使用自定义查找功能?

时间:2014-06-11 07:43:36

标签: c++ stl multimap

我有一个应用程序在C ++中使用STL的multimap

multimap中,我必须在自定义函数中使用find函数。即假设,我的多图的内容是{"Hello", "World"}, "{"Bye", "World"} and {"Foo", "Bar"}

我想搜索包含" e"本身,即它应该只返回"你好"和"再见"。

我该怎么做?

基本上,我想要定义自己的自定义相等,而不是检查绝对相等的已定义的find函数?

2 个答案:

答案 0 :(得分:4)

c++中的地图(和多地图)是为按键搜索而优化的数据结构。但是,使用声明地图时使用的比较运算符执行搜索。如果您需要使用不同的比较(在这种情况下是键中包含的字母)执行任何搜索,您将无法利用查找操作的良好性能。您唯一的选择是执行线性搜索。另一种选择是使用不同的(自定义)比较运算符声明地图。

答案 1 :(得分:2)

您正在寻找的内容可以完成,但不能使用multimap::findmultimap(或map)仅使用您为密钥排序提供的相同比较器执行查找,并且不能仅为(multi)map::find使用不同的比较器。< / p>

但是,您可以使用copy_if将所需的键值对复制到其他容器中。

std::multimap<std::string, std::string> m{{"Hello", "World"}, 
                                          {"Bye", "World"}, 
                                          {"Foo", "Bar"}};
std::vector<decltype(m)::value_type> vec;

std::copy_if(m.begin(), m.end(), std::back_inserter(vec),
    [](decltype(m)::value_type const& kv) {
        return std::any_of(kv.first.begin(), kv.first.end(), 
                           [](decltype(*kv.first.begin()) c) {return c == 'e';});
    });

vec将包含您感兴趣的键值对。

Live demo

相关问题