我有一个应用程序在C ++中使用STL的multimap
。
在multimap
中,我必须在自定义函数中使用find
函数。即假设,我的多图的内容是{"Hello", "World"}, "{"Bye", "World"} and {"Foo", "Bar"}
。
我想搜索包含" e"本身,即它应该只返回"你好"和"再见"。
我该怎么做?
基本上,我想要定义自己的自定义相等,而不是检查绝对相等的已定义的find函数?
答案 0 :(得分:4)
c++
中的地图(和多地图)是为按键搜索而优化的数据结构。但是,使用声明地图时使用的比较运算符执行搜索。如果您需要使用不同的比较(在这种情况下是键中包含的字母)执行任何搜索,您将无法利用查找操作的良好性能。您唯一的选择是执行线性搜索。另一种选择是使用不同的(自定义)比较运算符声明地图。
答案 1 :(得分:2)
您正在寻找的内容可以完成,但不能使用multimap::find
。 multimap
(或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
将包含您感兴趣的键值对。