- #include <set>
#include <string>
#include <iostream>
#include<algorithm>
#include<cctype>
using namespace std;
int ciStringCompare(const string & lhs, const string & rhs); struct
CIStringCompare :
public
binary_function<string, string, bool> {
bool operator()(const string & lhs, const string & rhs)const
{
return ciStringCompare(lhs, rhs);
} };
int ciStringCompare(const string & lhs, const string & rhs) {
return _stricmp(lhs.c_str(), rhs.c_str()); /*
当s1<s2时,返回值<0
当s1=s2时,返回值=0
当s1>s2时,返回值>0 */ }
int main() {
set<string, CIStringCompare>ciss;
ciss.insert("Personal");
ciss.insert("perSonal");//判断是否是等价的,如果等价不会进行插入 /* 判断等价的条件是!(cmp(param1,param2)&& !(cme(param2,param1))//如果不等价才会插入
!(false)&& !(false) true && true;//所以判断为等价,所以不会进行插入 */
//打印证明没有进行插入 for(set<string, CIStringCompare>::iterator iter =
ciss.begin(); iter != ciss.end(); iter++) { cout << *iter << endl;
}
//按照等价进行判断(找到了)
if (ciss.find("perSonal") != ciss.end()) {
cout << "find it\n";
}
//按照相等进行判断(未找到)
if (find(ciss.begin(), ciss.end(), "perSonal")!=ciss.end()) {
cout << "find it use find\n";
} system("pause");
return 0;
}
effect STL 条款19 20 21讲的比较透彻
set,map自定义比较函数时,不应该返回等于的情况,因为如果返回==判断的话,那么
判断等价的条件!(cmp(param1,param2)&& !(cme(param2,param1))
==》!(true)&& !(true)
==》 false&& false
==》false
==》插入相同数据
==》破环数据结构,导致不可预料的错误发生。
结论1:永远让比较函数对等的值返回false
结论2:
2.1 iterator find(const key_type& _Keyval)//按照等价(条件)进行判断
2.2 template