Effective STL 第20条

2022-09-27  本文已影响0人  懒生活

关联容器里面如果存放的是指针注意指定需要的比较函数
如果不指定比较函数,那么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);
}
上一篇 下一篇

猜你喜欢

热点阅读