在set集合中使用二元谓词(编译器错误 C3848)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章