美文网首页
Effective STL 第20条

Effective STL 第20条

作者: 懒生活 | 来源:发表于2022-09-27 23:22 被阅读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);
}

相关文章

  • EFFECTIVE+STL中文版:50条有效使用STL的经验

    《Effective STL中文版:50条有效使用STL的经验》是EffectiveC++的第3卷,被评为“值得所...

  • 常用的 STL 查找算法

    常用的 STL 查找算法 《effective STL》中有句忠告,尽量用算法替代手写循环;查找少不了循环遍历,在...

  • Effective STL 第7条

    容器中的对象如果是指针,指针指向的资源,容器没有办法自动释放. 问题引出 容器在自己析构的时候,会把包含的对象逐个...

  • Effective STL 第28条

    正确使用reverse_iterator对于任何一个容器, 使用iterator, 你只可能正向正序访问容器内部的...

  • Effective STL 第22条

    主要不要修改set mutipleSet的key

  • Effective STL 第30条

    如果是区间操作,注意确保容器具有足够的区间 这个很矛盾, 我们害怕使用数组,就是因为数组有可能越界.为了不去考虑数...

  • Effective STL 第31条

    准确的选择排序算法 如果要对一个数列进行完全的排序,那么用sort是个不错的选择.但是如果只是部分排序, 要考虑更...

  • Effective STL 第34条

    为什么有些算法需要排序的区间 binary_search算法是二分查找, 这种查找需要查找空间的序列是有序的. 为...

  • Effective STL 第19条

    理解相等于等价相等的基础是 == , 如果x==y成立,就说明x和y的值相等对于有顺序关系的容器, 为了顺序的存在...

  • Effective STL 第25条

    散列表: 用key可以作为索引快速找到对应的value. 且这些对象在容器里面不排序. 散列表和标准关联容器set...

网友评论

      本文标题:Effective STL 第20条

      本文链接:https://www.haomeiwen.com/subject/ecoxartx.html