【问题标题】:Set of Structs Missing an Element缺少元素的结构集
【发布时间】:2017-08-30 02:41:42
【问题描述】:
#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 永远不会被添加到 s 由于比较返回 false 两次(即它认为集合中的值比较相等)。这个问题本质上是在寻求调试帮助,因此是题外话。
  • @rex:从什么时候开始询问调试帮助的问题?
  • @BenjaminLindley 我弄错了。对不起。

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


【解决方案1】:

std::set 仅包含每个 唯一 对象的一个​​副本。当您尝试在 weak ordering 下插入两个 等价 的对象时,这些对象被确定为不唯一的,并且只有第一个对象保留在容器中。

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

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

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

使用std::multiset 允许重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多