如何在 Multimap 的字符串中查找子字符串
How to Find a Substring in a String in a Multimap
如何在 multimap 的键中找到字符串中的子字符串?例如,如果我输入 "Louis," 那么会找到 Louisville、Louisberg 和 StLouis?
为什么要为此使用多地图?
std::string search_term = "Louis";
std::unordered_set<std::string> data = { "Louisville", "Louisberg", "StLouis" };
for (std::string const& each : data) {
if (std::find(each.begin(), each.end(), search_term) != std::string::npos) {
// contains it
}
}
我相信这将是一个不错的选择,如果你真的必须使用多重映射,那么做键的子字符串有点困难,因为这不是它们的目的
对于您想执行的操作,您必须在每个键中进行搜索,而不仅仅是前缀或后缀。我不认为有任何解决办法,而且它无法优化,因为搜索词可以出现在键中的任何位置。
您可以使用 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
是 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
作为谓词。
希望这对您有所帮助?它实际上是遍历地图的 for 循环。工作版本 here.
更新:
我刚看了你的评论,你说你的搜索应该 return 54049 结果。那是很多记录!为此,最好匹配前缀或后缀。您可以使用 std::map::lower_bound()
和 std::map::upper_bound()
.
如何在 multimap 的键中找到字符串中的子字符串?例如,如果我输入 "Louis," 那么会找到 Louisville、Louisberg 和 StLouis?
为什么要为此使用多地图?
std::string search_term = "Louis";
std::unordered_set<std::string> data = { "Louisville", "Louisberg", "StLouis" };
for (std::string const& each : data) {
if (std::find(each.begin(), each.end(), search_term) != std::string::npos) {
// contains it
}
}
我相信这将是一个不错的选择,如果你真的必须使用多重映射,那么做键的子字符串有点困难,因为这不是它们的目的
对于您想执行的操作,您必须在每个键中进行搜索,而不仅仅是前缀或后缀。我不认为有任何解决办法,而且它无法优化,因为搜索词可以出现在键中的任何位置。
您可以使用 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
是 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
作为谓词。
希望这对您有所帮助?它实际上是遍历地图的 for 循环。工作版本 here.
更新:
我刚看了你的评论,你说你的搜索应该 return 54049 结果。那是很多记录!为此,最好匹配前缀或后缀。您可以使用 std::map::lower_bound()
和 std::map::upper_bound()
.