【问题标题】:What values are inserted in the set with this C++ code?使用此 C++ 代码在集合中插入了哪些值?
【发布时间】:2017-01-15 06:09:58
【问题描述】:

我最近收到了一个包含以下代码的面试问题。不幸的是,我没有做对。有人可以帮助解释代码在做什么,尤其是注释行吗?

这里是代码。

#include <iostream>
#include <set>

struct C
{
    bool operator()(const int &a, const int &b) const
    {
        return a % 10 < b % 10;
    }
};

int main()
{
    std::set<int> x({ 4, 2, 7, 11, 12, 14, 17, 2 });
    std::cout << x.size();
    std::set<int, C> y(x.begin(), x.end());  // Not sure what is inserted in the set
    std::cout << y.size() << std::endl;

    return 0;
}

【问题讨论】:

  • 运行一下就知道了?
  • 我预测{11, 2, 4, 7}(我没有运行这个例子,老实说)。
  • ideone.com/8eL2f4我太客气了
  • 我运行了它,但我无法正确解释原因。 :(

标签: c++ stl set


【解决方案1】:

运行时,x 依次包含:

2 4 7 11 12 14 17

y 按顺序包含:

11 2 4 7

我的直觉是 set 反转运算符以检查是否相等(因为 set 仅包含唯一值)。因此只存在 a%10 的唯一值。

【讨论】:

  • set 不使用相等(如operator==)。它使用等价,定义为!(a&lt;b) &amp;&amp; !(b&lt;a)(两个元素的比较都不小于另一个),或者使用自定义比较器,!comp(a, b) &amp;&amp; !comp(b, a)。这就是第二组最终只包含唯一模 10 的元素的方式。
  • 感谢您的澄清,实际上我不确定set 如何检查相等性
  • 谢谢伊戈尔,我想你只是给了我应该寻找什么的线索。该集合是由仅存储唯一模 10 值的事实形成的。我完全没有将 2 和 12 与该自定义运算符相同的事实联系起来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多