gpt4 book ai didi

c++ - 在 C++ 中拥有一组结构的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 06:12:14 25 4
gpt4 key购买 nike

我需要一组自定义结构,以便能够快速检索具有最小给定参数的实例。但是,我发现 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 < bb < a两者都是正确的,这会导致未定义的行为。但 std::set 会检查这一点,因此它会删除其中一个元素。对我来说最好的解决方案是修改比较器,使其包含 bar .

最佳答案

发生这种情况是因为您只比较 foo,如果 foo 相等,则对象被视为相等。 std::set 仅保留等效值之一。如果 bar 使对象唯一,请在比较中包含 bar ,否则,如果您仍想保留两个(等效)值,请使用 std::multiset。两者都是有效的解决方案,具体取决于您想要做什么。

关于c++ - 在 C++ 中拥有一组结构的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60377491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com