C++ 如何在多重映射中的字符串中查找子字符串

C++ 如何在多重映射中的字符串中查找子字符串,c++,multimap,C++,Multimap,如何在多重映射的键中找到字符串中的子字符串?例如,如果我输入“Louis”,那么就可以找到Louisville、Louisberg和StLouis?为什么要为此设置多重映射 std::字符串搜索\u term=“Louis”; 无序集数据={“路易斯维尔”、“路易斯伯格”、“斯劳伊斯”}; for(std::string const&each:data){ 如果(std::find(each.begin()、each.end()、search_term)!=std::string::npos){

如何在多重映射的键中找到字符串中的子字符串?例如,如果我输入“Louis”,那么就可以找到Louisville、Louisberg和StLouis?

为什么要为此设置多重映射

std::字符串搜索\u term=“Louis”;
无序集数据={“路易斯维尔”、“路易斯伯格”、“斯劳伊斯”};
for(std::string const&each:data){
如果(std::find(each.begin()、each.end()、search_term)!=std::string::npos){
//包含它
} 
}

我相信这是一个很好的选择,如果你真的必须使用多重贴图,那么做键的子字符串有点困难,因为它们不是为之而设计的,为什么要为此而使用多重贴图呢

std::字符串搜索\u term=“Louis”;
无序集数据={“路易斯维尔”、“路易斯伯格”、“斯劳伊斯”};
for(std::string const&each:data){
如果(std::find(each.begin()、each.end()、search_term)!=std::string::npos){
//包含它
} 
}

我相信这是一个很好的选择,如果你真的要使用多重映射,那么做键的子串有点困难,因为这不是它们的目的,你要做什么,你必须在每个键中搜索,而不仅仅是前缀或后缀。我不认为有任何方法可以绕过这一点,也无法对其进行优化,因为搜索词可以出现在关键字中的任何位置

您可以使用
std::find_if
并提供一个谓词函数来匹配元素并迭代映射。我在下面的代码中使用了
std::map
,但这也适用于
std::multimap

#include <map>
#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    std::map<std::string, std::string> myMap{
        {"Louis", "AA"}, {"Louisville", "BBB"}, {"Louisberg", "A"},
        {"StLouis ", "C"}, {"Huntsville", "D"} };

    std::string term("Louis");

    auto keyContains = [&term](const std::pair<std::string, std::string>& item)
    {
        return item.first.find(term) != std::string::npos;
    };

    auto iter = std::find_if(myMap.begin(), myMap.end(), keyContains);

    while (iter != myMap.end())
    {
        std::cout << iter->first << std::endl;
        iter = std::find_if(std::next(iter), myMap.end(), keyContains);
    }
}
然后像这样初始化:
keyContains comp(“Louis”)
并将
comp
作为谓词传递

希望这有帮助?它实际上是一个遍历地图的for循环。工作版本

更新:


我刚刚读了你的评论,你说你的搜索应该返回54049结果。那是很多唱片!要做到这一点,最好匹配前缀或后缀。您可以使用
std::map::lower\u-bound()
std::map::upper\u-bound()

来搜索要执行的操作,您必须在每个键中搜索,而不仅仅是前缀或后缀。我不认为有任何方法可以绕过这一点,也无法对其进行优化,因为搜索词可以出现在关键字中的任何位置

您可以使用
std::find_if
并提供一个谓词函数来匹配元素并迭代映射。我在下面的代码中使用了
std::map
,但这也适用于
std::multimap

#include <map>
#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    std::map<std::string, std::string> myMap{
        {"Louis", "AA"}, {"Louisville", "BBB"}, {"Louisberg", "A"},
        {"StLouis ", "C"}, {"Huntsville", "D"} };

    std::string term("Louis");

    auto keyContains = [&term](const std::pair<std::string, std::string>& item)
    {
        return item.first.find(term) != std::string::npos;
    };

    auto iter = std::find_if(myMap.begin(), myMap.end(), keyContains);

    while (iter != myMap.end())
    {
        std::cout << iter->first << std::endl;
        iter = std::find_if(std::next(iter), myMap.end(), keyContains);
    }
}
然后像这样初始化:
keyContains comp(“Louis”)
并将
comp
作为谓词传递

希望这有帮助?它实际上是一个遍历地图的for循环。工作版本

更新:


我刚刚读了你的评论,你说你的搜索应该返回54049结果。那是很多唱片!要做到这一点,最好匹配前缀或后缀。您可以使用
std::map::lower_bound()
std::map::upper_bound()

将以下工作(员工是一个向量)``用于(const&search:cities){if(find(search.begin(),search.end(),string)!=npos)employeess.emplace_back(set[i]);i++}``不太可能,因为集合[i]实际上不可能完成以下工作(雇员是一个向量)`` for(const&search:cities){if(find(search.begin(),search.end(),string)!=npos)employeess.emplace_back(set[i]);i++}“``不太可能,因为集合[i]不太可能找到部分匹配:这能回答你的问题吗?@jignatius它在“Louisville”中为“Louis”起作用,但在“Louisville”中搜索“ville”时不起作用。”对于我正在做的作业,我尝试过,但没有得到任何结果,应该得到54049个结果。@jignatius我正在使用honk on完成的代码搜索前缀“Lou”,“Louisville”,等等,但我觉得如果有人能告诉我如何做后缀,它可能会解决我的问题。请查看以下查找部分匹配:这是否回答了您的问题?@jignatius它在“Louisville”中为“Louis”工作,就像在“Louisville”中一样,但在“Louisville”中搜索“ville”时不起作用对于我正在做的作业,我尝试了,但没有结果,应该得到54049个结果。@jignatius我正在使用honk on完成的代码来搜索前缀“Lou”、“Louisville”等,但我觉得如果有人能告诉我如何做后缀,可能会解决我的问题。