std::set在插入元素时如何检查集合中是否存在等价元素?

7

让我们以以下代码为例。

auto cmp = [](ll a, ll b) {
    return gcd(12, a) < gcd(12, b);
};
set<ll, decltype(cmp)> s(cmp);
for(ll i = 0; i < 2; i++){
    ll x;
    cin >> x;
    s.insert(x);
    cout << "Success! \n";
}

我定义了一个新的比较器,通过这个比较器可以将数字按它们与12的最大公约数进行比较。

首先,我成功地插入了5。然后我尝试插入7,但没有成功。

我知道gcd(12, 5) = gcd(12, 7) = 1。

但是我无法理解std::set如何检查5是否等同于7。

使用我提供的比较器comp,它可以通过比较发现gcd(12, 7)不小于gcd(12, 5),但它如何找出gcd(12, 7)等于gcd(12, 5)呢?

1个回答

11

它会调用比较器两次,且参数顺序不同。

如果cmp(x, y)cmp(y, x)都为false,则认为xy是等价的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接