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

时间:2015-03-07 21:17:45

标签: c++ set compare

以下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;
}

1 个答案:

答案 0 :(得分:3)

set的第二个模板参数是比较器类型 - 实现较少操作的仿函数类型。

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

此比较器仅在a时将ba < b作为a % 10 < b % 10进行比较,因此几乎所有数字都将以模10进行比较。

更新:

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

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

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

x12, 14, 17)中的其他数字不会被插入,因为set会找到,12应该代替2(因为2 % 10 < 12 % 10 or 12 % 10 < 2 % 10表达式为false,因此2 == 12),同样1417