案例:在set集合中插入小写字母,通过find去查找,而find函数区分大小写。因此需要通过仿函数来解决
struct NoDistincyion
{
bool operator()(const string &str1,const string &str2)
{
string str1_;
str1_.resize(str1.size());
transform(str1.begin(), str1.end(), str1_.begin(), tolower);//预定义函数对象
string str2_;
str2_.resize(str2.size());
transform(str2.begin(), str2.end(), str2_.begin(), tolower);//预定义函数对象
return str1_ < str2_;//从小到大排序
}
};
void Fun1()
{
set<string> s1;
s1.insert("aa");
s1.insert("bb");
s1.insert("cc");
set<string>::iterator it = s1.find("aa");//find 会区分大小写
if (it == s1.end())
{
cout << "没有找到" << endl;
}
else
{
cout << "找到了" << endl;
}
set<string, NoDistincyion> s2;
s2.insert("aa");
s2.insert("bb");
s2.insert("cc");
set<string,NoDistincyion>::iterator it1 = s2.find("aA");//find 会区分大小写
if (it1 == s2.end())
{
cout << "没有找到" << endl;
}
else
{
cout << "找到了" << endl;
}
}
在vs2017编译器下报错:编译器错误 C3848
具有类型“const NoDistincyion”的表达式会丢失一些 const - volatile 限定符以调用“bool NoDistincyion::operator ()(const std::string &, const std::string &)“
意思是在使用NoDistincyion时存在const属性,但是调用该NoDistincyion的表达式bool operator()(const string &str1,const string &str2)不具有const属性,丢失const,所以无法通过编译
修改之后
bool operator()(const string &str1,const string &str2) const
{
string str1_;
str1_.resize(str1.size());
transform(str1.begin(), str1.end(), str1_.begin(), tolower);//预定义函数对象
string str2_;
str2_.resize(str2.size());
transform(str2.begin(), str2.end(), str2_.begin(), tolower);//预定义函数对象
return str1_ < str2_;//从小到大排序
}