c – 如何使map :: find操作不区分大小写?
作者:互联网
map :: find方法是否支持不区分大小写的搜索?我有一张地图如下:
map<string, vector<string> > directory;
并希望以下搜索忽略大小写:
directory.find(search_string);
解决方法:
它不是默认的.您必须提供自定义比较器作为第三个参数.以下片段将帮助您……
/************************************************************************/
/* Comparator for case-insensitive comparison in STL assos. containers */
/************************************************************************/
struct ci_less : std::binary_function<std::string, std::string, bool>
{
// case-independent (ci) compare_less binary function
struct nocase_compare : public std::binary_function<unsigned char,unsigned char,bool>
{
bool operator() (const unsigned char& c1, const unsigned char& c2) const {
return tolower (c1) < tolower (c2);
}
};
bool operator() (const std::string & s1, const std::string & s2) const {
return std::lexicographical_compare
(s1.begin (), s1.end (), // source range
s2.begin (), s2.end (), // dest range
nocase_compare ()); // comparison
}
};
像std :: map<一样使用它std :: string,std :: vector< std :: string>,ci_less> MYMAP;
注意:std :: lexicographical_compare有一些细节.如果考虑区域设置,字符串比较并不总是很简单.如果感兴趣,请参阅c.l.c上的this线程.
更新:使用C 11 std :: binary_function已弃用,因为类型是自动推断的,所以不需要.
struct ci_less
{
// case-independent (ci) compare_less binary function
struct nocase_compare
{
bool operator() (const unsigned char& c1, const unsigned char& c2) const {
return tolower (c1) < tolower (c2);
}
};
bool operator() (const std::string & s1, const std::string & s2) const {
return std::lexicographical_compare
(s1.begin (), s1.end (), // source range
s2.begin (), s2.end (), // dest range
nocase_compare ()); // comparison
}
};
标签:c,string,dictionary,case-insensitive,stl 来源: https://codeday.me/bug/20190923/1814894.html