map::find
方法是否支持不区分大小写的搜索?我有一张地图如下:
map<string, vector<string> > directory;
并希望以下搜索忽略大小写:
directory.find(search_string);
原文由 TL36 发布,翻译遵循 CC BY-SA 4.0 许可协议
map::find
方法是否支持不区分大小写的搜索?我有一张地图如下:
map<string, vector<string> > directory;
并希望以下搜索忽略大小写:
directory.find(search_string);
原文由 TL36 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是与 strcasecmp(仅适用于 posix)不同的跨平台标准 c++ 解决方案,不使用我亲自编写的任何外部库,如 boost。它利用了 std::map
的比较功能。
#include <algorithm>
#include <cctype>
#include <iostream>
#include <map>
#include <string>
bool caseInsensitiveCompare(const std::string& a, const std::string& b) {
std::string aLower = a;
std::string bLower = b;
std::transform(aLower.begin(), aLower.end(), aLower.begin(), [](unsigned char c){ return std::tolower(c); });
std::transform(bLower.begin(), bLower.end(), bLower.begin(), [](unsigned char c){ return std::tolower(c); });
return aLower < bLower;
};
int main()
{
std::map<std::string, std::string, decltype(&caseInsensitiveCompare)> myMap(&caseInsensitiveCompare);
myMap.insert({"foo", "foo"});
myMap.insert({"bar", "bar"});
myMap.insert({"baz", "baz"});
auto it = myMap.find("FoO");
if (it != myMap.end()) std::cout << "Found FoO: " << it->second << std::endl;
else std::cout << "Not found FoO" << std::endl;
it = myMap.find("foo");
if (it != myMap.end()) std::cout << "Found foo: " << it->second << std::endl;
else std::cout << "Not found foo" << std::endl;
it = myMap.find("not contained");
if (it != myMap.end()) std::cout << "Found not contained: " << it->second << std::endl;
else std::cout << "Not found notcontained" << std::endl;
return 0;
}
原文由 László Papp 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.3k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
1 回答2.7k 阅读✓ 已解决
3 回答525 阅读✓ 已解决
默认情况下它不会。您必须提供一个自定义比较器作为第三个参数。以下片段将帮助您…
像
std::map< std::string, std::vector<std::string>, ci_less > myMap;
一样使用它注意:std::lexicographical_compare 有一些细节。如果您考虑语言环境,字符串比较并不总是那么简单。如果有兴趣,请参阅 clc++ 上的 此 线程。
更新:使用 C++11
std::binary_function
已被弃用并且是不必要的,因为类型是自动推断的。