关联容器里面如果存放的是指针注意指定需要的比较函数
如果不指定比较函数,那么set会默认按指针本身的值进行排序. 默认从小到大.
void printStringVec(string* a)
{
cout << *a << endl;
}
int main()
{
set<string*> stringPtrSet;
stringPtrSet.insert(new string("b hello"));
stringPtrSet.insert(new string("a hello"));
stringPtrSet.insert(new string("c hello"));
for_each(stringPtrSet.begin(), stringPtrSet.end(), printStringVec);
}
上面的代码打印出来后,顺序如下:
b hello
a hello
c hello
或许你期望的输出是 a hello b hello c hello. 注意代码中的stringPtrSet值负责默认的对string* 类型的指针本身的值进行拍寻存放. 如果你期望按照指针指向的字符串的值进行排序,那么需要改写一下set的默认比较函数. 下面代码中set<string*, StringPtrLess> stringPtrSet;
语句指定了stringPtrSet的排序依据是StringPtrLess. 在StringPtrLess的比较代码中是按字符串比较的,而不是按指针本身大小比较的.为什么set<string*, StringPtrLess> stringPtrSet;
模板的第二个入参不能直接用一个函数指针代替. 如果用函数指针这里会编译失败. <>
里面是模板参数,放的是类型,不能放函数指针
void printStringVec(string* a)
{
cout << *a << endl;
}
class StringPtrLess
{
public:
bool operator()(const string* ps1, const string* ps2) const
{
return *ps1 < *ps2;
}
};
int main()
{
set<string*, StringPtrLess> stringPtrSet;
stringPtrSet.insert(new string("b hello"));
stringPtrSet.insert(new string("a hello"));
stringPtrSet.insert(new string("c hello"));
for_each(stringPtrSet.begin(), stringPtrSet.end(), printStringVec);
}
网友评论