c++ - 如何在 multimap 的字符串中查找子字符串

标签 c++ multimap

如何在多图键的字符串中找到子字符串?例如,如果我输入“Louis”,那么是否找到了Louisville,Louisberg和StLouis?

最佳答案

对于您要执行的操作,您将必须在每个键中进行搜索,而不仅是前缀或后缀。我认为这没有任何办法,也无法优化,因为搜索词可以出现在键内的任何位置。

您可以使用std::find_if并提供谓词函数以匹配元素并迭代 map 。我在下面的代码中使用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是lambda函数。如果您不熟悉lambda函数,则可以使用仿函数:
struct keyContains
{
    keyContains(const std::string& searchTerm) : mSearchTerm(searchTerm) {}

    bool operator() (const std::pair<std::string, string>& item) const
    {
        return item.first.find(mSearchTerm) != std::string::npos;
    }

    std::string mSearchTerm;
};

然后像这样初始化它:keyContains comp("Louis")并传递comp作为谓词。

希望这对您有帮助吗?它实际上是遍历 map 的for循环。工作版本here

更新:

我刚刚读了您的评论,您说您的搜索应返回 54049 结果。有很多记录!为此,最好将其与前缀或后缀匹配。您可以使用std::map::lower_bound()std::map::upper_bound()

关于c++ - 如何在 multimap 的字符串中查找子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59923324/

相关文章:

C++ Lambda 通过引用捕获

java - 根据日期范围按键过滤多图

java - 允许按值快速查找键的 Java multimap

c++ - 如何在成对集合上使用 lower_bound()?

c++ - scanf() 不接受空格

java - 在没有竞争的情况下在并发多映射上实现删除

c - C 中多重映射的任何良好实现?

java - 选择正确的系列

c++ - 使用并行编程 C++ 计算/访问 vector

c++ - 用作模板类型时,size_t 类型和 int 类型的用法有何区别?