#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
谢谢!
答案 0 :(得分:3)
std::set
仅包含每个唯一对象的一个副本。当您尝试在弱排序下插入两个等效的对象时,确定对象不唯一,并且只有第一个对象保留在容器中。
在您的代码中,由于比较器的定义,0
和1
在弱排序下是等效的。那就是:
dist[0] = 2;
dist[1] = 2;
cmp compare;
bool res1 = compare(0, 1); //false
bool res2 = compare(1, 0); //false
当两个方向的比较都是假的时,这两个对象被认为是等价的。只有插入的第一个包含在集合中。
使用std::multiset
允许重复。