是否可以在multimap中使用自定义查找功能? 我在C++中使用了STL中的 MultIMAP < /C>。p>

是否可以在multimap中使用自定义查找功能? 我在C++中使用了STL中的 MultIMAP < /C>。p>,c++,stl,multimap,C++,Stl,Multimap,在multimap中,我必须在自定义函数中使用find函数。例如,我的多重映射的内容是{“Hello”,“World”},{“Bye”,“World”}和{“Foo”,“Bar”} 我想搜索本身包含“e”的密钥,即它应该只返回“Hello”和“Bye” 我该怎么做 基本上,我不想使用已经定义的find函数来检查绝对相等,而是想定义自己的自定义相等?一个映射(和多映射)在c++中,是一种为按键搜索而优化的数据结构。但是,搜索是使用声明映射时使用的比较运算符执行的。如果需要使用不同的比较(在本例中,

multimap
中,我必须在自定义函数中使用
find
函数。例如,我的多重映射的内容是
{“Hello”,“World”},{“Bye”,“World”}和{“Foo”,“Bar”}

我想搜索本身包含“e”的密钥,即它应该只返回“Hello”和“Bye”

我该怎么做


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

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

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

您要查找的内容可以完成,但不能使用
multimap::find
multimap
(或
map
)仅使用为键排序提供的相同比较器执行查找,并且不可能仅对
(多)map::find
使用不同的比较器

但是,如果要将键值对复制到其他容器中,则可以使用
copy\u

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';});
    });
std::multimap m{{“你好”,“世界”},
{“再见”,“世界”},
{“Foo”,“Bar”};
std::vec;
std::copy_if(m.begin()、m.end()、std::back_插入器(vec),
[](数据类型(m)::值\类型常数和千伏){
返回std::(kv.first.begin()、kv.first.end()中的任意值,
[](decltype(*kv.first.begin())c){return c=='e';});
});
vec
将包含您感兴趣的键值对


您要查找的内容可以完成,但不能使用
multimap::find
multimap
(或
map
)仅使用为键排序提供的相同比较器执行查找,并且不可能仅对
(multi)map::find
使用不同的比较器

但是,如果
要将键值对复制到其他容器中,则可以使用
copy\u

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';});
    });
std::multimap m{{“你好”,“世界”},
{“再见”,“世界”},
{“Foo”,“Bar”};
std::vec;
std::copy_if(m.begin()、m.end()、std::back_插入器(vec),
[](数据类型(m)::值\类型常数和千伏){
返回std::(kv.first.begin()、kv.first.end()中的任意值,
[](decltype(*kv.first.begin())c){return c=='e';});
});
vec
将包含您感兴趣的键值对


(multimap完全相同),但请注意,使用比较器将改变数据在multimap中的存储方式:其中许多不是OP想要的。(可能“e”是一个具体示例)。@Bathsheba自定义函数将在(multi)的整个生命周期内使用)映射。没有办法使用不同的自定义函数,例如对
find
@n.m.的不同调用。我希望在搜索ie find操作中使用自定义函数,而不是在存储操作中使用自定义函数…这是问题的症结所在。不,查找操作不能使用不同的比较器。(multimap完全相同)但请注意,使用比较器将改变数据存储在multimap中的方式:其中许多不是OP想要的。(也许“e”是一个具体的例子)。@Bathsheba自定义函数将在(multi)的整个生命周期内使用)映射。没有办法在不同的调用中使用不同的自定义函数,例如对
find
@n.m.的不同调用。我希望在搜索ie查找操作中使用自定义函数,而不是在存储操作中使用自定义函数…这是问题的症结所在。不,您不能为查找操作使用不同的比较器。