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

标签 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;
}

最佳答案

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

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

这个比较器将比较ab作为a < b仅当a % 10 < b % 10 , 所以实际上所有数字都将通过模 10 进行比较。

更新:

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

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

插入后{2, 4, 7}来自 xy , 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 .

关于c++ - 使用自定义比较函数设置构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28920111/

相关文章:

ruby - 在 Ruby 中比较数组并删除重复项?

c++ - 长期绘制密集粒子系统的良好且安全的语言是什么?

c++ - 添加 Sprite 时窗口关闭

python - 如何找到两个字典列表之间的区别?

algorithm - 用于查找严格子集的快速数据结构(从给定列表中)

c++ - 冒泡排序c++中的比较函数

java - 自定义 Java 按名称排序

c++ - 使用 Visual C++ 进行地址 sanitizer : ignore read buffer overflows while still catching write buffer overflows

c++ - 如何在 X86 PC 上为 arm 编译 gcc 编译器

Kotlin:自定义顺序的迭代器