美文网首页
Effective STL 第21条

Effective STL 第21条

作者: 懒生活 | 来源:发表于2022-09-29 22:24 被阅读0次

如果你自己指定容器的比较函数,那么切记不要出现等号
如果你定义如下的set<int, less_equal<int>> intSet; 这个intSet在下面的代码中执行到第二个intSet.insert(5);的时候,程序就会崩溃. 但是编译是能过的. 因为按set的等价原则, 第二个5 通过if ((5 not less_equal others) And (others not less_equal 5))来确定等价关系.当第二个5和set中已经插入的5比较的时候用的表达式是if(!(5>=5) && !(5>=5)) 这个表达式成立表示等价,不成立表示不等价, 所以这里会判定第二个5于已经插入set的第一个5不等价.这会导致第二个5被插入set. 从而破坏了set的不重复的特性. 运行期会崩溃.

void printStringVec(int a)
{
    cout << a << endl;
}

int main()
{
    set<int, less_equal<int>> intSet;
    intSet.insert(5);
    intSet.insert(10);
    intSet.insert(5);
    for_each(intSet.begin(), intSet.end(), printStringVec);
}

所以如果是自己写关联容器的比较函数的时候,不要出现"大于等于" 或者"小于等于"做判决. 类似下面的判决条件也不行,因为return !(*ps1 < *ps2); 等价于 return (*ps1 >= *ps2);

class StringPtrGreater
{
public:
    bool operator()(const string* ps1, const string* ps2) const
    {
        return !(*ps1 < *ps2);
    }
};

相关文章

  • 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 第21条

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