Skip to main content
 首页 » 编程设计

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

2024年05月22日13haluo1

我需要一组自定义结构,以便能够快速检索具有最小给定参数的实例。但是,我发现 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。两者都是有效的解决方案,具体取决于您想要做什么。