我需要一组自定义结构,以便能够快速检索具有最小给定参数的实例。但是,我发现 std::set 认为某些实例是相同的,即使它们具有不同的值。这是我的示例程序:
#include <set>
#include <iostream>
struct S
{
int foo, bar;
S(int foo, int bar): foo(foo), bar(bar) {}
};
inline bool operator<(const S& a, const S& b)
{
return a.foo < b.foo;
}
int main()
{
std::set<S> baz;
baz.emplace(1, 2);
baz.emplace(1, 3);
std::cout << baz.size();
return 0;
}
该程序打印1
std::set 考虑 S(1, 2)
和S(1, 3)
是一样的。我猜这是因为 bar
比较它们时不使用。但我需要集合来保留这两个元素,我该如何解决这个问题?
编辑:我觉得我没有正确地表达我的问题:我想保留不完全相同的实例,但是 std::multiset
对我不起作用,因为我不希望容器中存在相同的实例
解决方案:我想我明白出了什么问题。我假设如果有 2 个元素 a < b
和b < a
两者都是正确的,这会导致未定义的行为。但 std::set 会检查这一点,因此它会删除其中一个元素。对我来说最好的解决方案是修改比较器,使其包含 bar
.
请您参考如下方法:
发生这种情况是因为您只比较 foo
,如果 foo
相等,则对象被视为相等。 std::set
仅保留等效值之一。如果 bar
使对象唯一,请在比较中包含 bar
,否则,如果您仍想保留两个(等效)值,请使用 std::multiset
。两者都是有效的解决方案,具体取决于您想要做什么。