集合和多重集合只是谓词不同吗?

Do set and multiset differ just by a predicate?

本文关键字:集合 谓词      更新时间:2023-10-16

使用以下示例代码:

class cmp
{
public:
bool operator()(int a, int b) { return a<=b; }
};
int main()
{
set<int, cmp> s;
s.insert(2);
s.insert(2);
s.insert(4);
s.insert(5);
s.insert(6);
copy(s.begin(), s.end(), ostream_iterator<int>(cout, "  "));
cout<<endl;
multiset<int> ms;
ms.insert(2);
ms.insert(2);
ms.insert(4);
ms.insert(5);
ms.insert(6);
copy(ms.begin(), ms.end(), ostream_iterator<int>(cout, "  "));
cout<<endl;
return 0;
}

设置 - 包含唯一值。

多集 - 可以包含重复值。

但是在我的集合实现中,我更改了谓词以接受重复值。如果我们可以通过更改谓词来做到这一点,what's the purpose of having two different containers?我相信功能也是相同的,实现也是相同的(平衡树)。如果我错过了什么,有人可以详细说明吗?

Compare关系必须是严格-弱排序(在这两种情况下)§23.2.4/2:

每个关联容器都Key参数化,并且Compare排序关系在Key元素上诱导严格的弱排序(25.4)。[...]

和 §25.4/4:

术语严格是指非反身关系的要求(!comp(x, x)对于所有x),[...]

您的自定义Compare(cmp) 不符合此要求,因此未定义std::set<int, cmp>的行为。