我想扩展杰森的回答。我同意 Jason 的观点,对于您的具体情况,要么 要么std::set
是std::multiset
最佳选择。我想提供一个示例,以帮助您进一步缩小选择范围。
假设您有以下课程Foo
:
class Foo {
public:
Foo(int v1, int v2) : val1(v1), val2(v2) {};
bool operator<(const Foo &foo) const { return val2 < foo.val2; }
int val1;
int val2;
};
在这里,Foo
重载<
运算符。这样,您无需指定显式比较器函数。因此,您可以通过以下方式简单地使用 astd::multiset
而不是 a std::vector
。您只需替换push_back()
为insert()
:
int main()
{
std::multiset<Foo> ms;
ms.insert(Foo(1, 6));
ms.insert(Foo(1, 5));
ms.insert(Foo(3, 4));
ms.insert(Foo(2, 4));
for (auto const &foo : ms)
std::cout << foo.val1 << " " << foo.val2 << std::endl;
return 0;
}
输出:
3 4
2 4
1 5
1 6
正如你所看到的,容器是val2
根据类的成员排序的Foo
,基于<
操作符。但是,如果您使用std::set
而不是 a std::multiset
,那么您将获得不同的输出:
int main()
{
std::set<Foo> s;
s.insert(Foo(1, 6));
s.insert(Foo(1, 5));
s.insert(Foo(3, 4));
s.insert(Foo(2, 4));
for (auto const &foo : s)
std::cout << foo.val1 << " " << foo.val2 << std::endl;
return 0;
}
输出:
3 4
1 5
1 6
在这里,缺少 4 的第二个Foo
对象val2
,因为 astd::set
只允许唯一的条目。条目是否唯一取决于提供的<
运算符。在此示例中,<
操作员将val2
成员相互比较。因此,如果两个Foo
对象的val2
成员具有相同的值,则它们是相等的。
因此,您的选择取决于您是否要存储Foo
基于运算符可能相等的对象<
。
Ideone 上的代码