【问题标题】:About set container关于设置容器
【发布时间】:2017-06-05 05:52:48
【问题描述】:
std::set<int, std::less_equal<int>> myset = {1,1,7,8,2,2};
myset.insert(99);
myset.insert(99);
for(const int & val : myset)
    std::cout << val << " ";

输出:

1 1 2 2 7 8 99 99 

你好,我正在研究容器。我意识到当我使用less_equal 函数时,标准集容器的行为就像一个多集容器。这是正常的吗?如果是,multiset和set有什么区别?

【问题讨论】:

  • 这是“正常的”,因为没有 ab正常的未定义行为。

标签: c++ stl set containers multiset


【解决方案1】:

这正常吗?

不,这不正常。您不能将std::less_equal 指定为std::set 的比较器,因为它不满足严格的弱排序规则。

查看要求here

【讨论】:

    【解决方案2】:

    当您使用std::less_equal&lt;int&gt; 时,您使用&lt;= 对您的容器进行排序。当您插入第二个99 时,该集合会遍历其内部数据结构,寻找插入99 的位置。它必须检查是否存在相同的值。关联容器的“相同”的定义是等价的。等价意味着容器使用!(a &lt;= b) &amp;&amp; !(b &lt;= a) 来检查两个项目是否具有相同的值。如果将ab 替换为相应的值,您将得到:!(99 &lt;= 99) &amp;&amp; !(99 &lt;= 99) =&gt; !(true) &amp;&amp; !(true) =&gt; false &amp;&amp; false =&gt; false。所以你不能将less_equal 用于关联容器。

    【讨论】:

      【解决方案3】:

      Set、map、multiset、multimap 等。要求您提供总排序功能。总订单意味着对于任何两个项目,要么

      • A op B 返回 true,B op A 返回 false - A 更小。
      • A op B 返回 false,B op A 返回 true - B 小于。
      • A op B 返回 false,B op A 返回 false - 它们是相等的。

      对于这两种变体,可能没有任何返回 true 的值。 std::less_equal 不符合这一点;所以容器会以某种未定义的方式运行。

      认为这相当于坐在沙发上的腿上。它不是为此而设计的。它可能有一些看起来不错的结果,但不要指望它会继续以这种方式工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-08
        • 2022-11-03
        相关资源
        最近更新 更多