案例:在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_;//從小到大排序
}