使用自定义比较函数设置构造函数

set constructor with custom compare function

下面的y.size() = 4是怎么来的? y 中的值是 {11, 2, 4, 7} 如何得到这个?集合的每次迭代的 operator() 函数中的 a 和 b 是什么。我不明白 y 的构造,我在网上找不到任何解释这种情况的东西。谢谢

#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::endl;
    std::set<int, C> y(x.begin(), x.end());
    std::cout << y.size() << std::endl;
    std::set<int>::iterator iter;
    for (iter = y.begin(); iter != y.end(); ++iter)
    {
        std::cout << *iter << std::endl;
    }
    return 0;
}

set 的第二个模板参数是比较器类型——实现 less 操作的函子类型。

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

此比较器仅在 a % 10 < b % 10 时才会将 aba < b 进行比较,因此实际上所有数字都将通过模 10 进行比较。

更新:

推入 x 集合数字 { 4, 2, 7, 11, 12, 14, 17, 2 } 后,集合将包含七个元素 { 2, 4, 7, 11, 12, 14, 17 }。这些元素将以这种方式排序,因为 set 以排序方式存储对象。

然后 x 组中的数字将依次插入到 y 组中。在插入每个元素之前,set 将按照当前插入的数字的排序顺序找到合适的位置。如果 set 会看到,它的位置上已经有一些数字,set 将不会插入它。

xy插入{2, 4, 7}后,y将是{2, 4, 7}。 然后,将 11 插入 y set 将对 11{2, 4, 7} 进行比较,以使用提供的 C 仿函数找到合适的位置。 要检查是 11 小于 2 set 会调用 C()(11, 2),这将导致 11 % 10 < 2 % 10 比较,这将导致 true,所以11 将被插入到 2 之前。

不会插入来自 x (12, 14, 17) 的其他数字,因为 set 会发现 12 应该代替 2 (因为2 % 10 < 12 % 10 or 12 % 10 < 2 % 10表达式为假,所以2 == 12),同理1417.