错过元素的结构集

时间:2017-08-30 02:41:43

标签: c++ c++11 struct set

#include <bits/stdc++.h>
using namespace std;

int dist[2];
struct cmp {
    bool operator() (const int &a, const int &b) {
        return dist[a] < dist[b];
    }
};
set<int, cmp> s;

int main() {
    dist[0] = 2;
    dist[1] = 2;
    s.insert(1);
    s.insert(0);
    for(set<int>::iterator it = s.begin(); it != s.end(); ++it) {
        cout << *it << " " << dist[*it] << endl;
    }
}

以上代码输出:

1 2

为什么这是真的?如果不输出:

1 2

0 2

谢谢!

1 个答案:

答案 0 :(得分:3)

std::set仅包含每个唯一对象的一个​​副本。当您尝试在弱排序下插入两个等效的对象时,确定对象不唯一,并且只有第一个对象保留在容器中。

在您的代码中,由于比较器的定义,01在弱排序下是等效的。那就是:

dist[0] = 2;
dist[1] = 2;
cmp compare;
bool res1 = compare(0, 1); //false
bool res2 = compare(1, 0); //false

当两个方向的比较都是假的时,这两个对象被认为是等价的。只有插入的第一个包含在集合中。

使用std::multiset允许重复。