默认情况下,在C ++中,std::set
和std::multiset
都有std::less<T>
作为比较器。任何人都可以解释一下std::multiset
如何允许重复,而std::set
不允许?
答案 0 :(得分:6)
两者都以现有内容的等效upper_bound
开头,以便为新项找到正确的插入点。
std::set
然后检查是否找到了一个密钥等于新密钥的现有项目,如果是,则返回信令失败。
std::multiset
只需在该点插入新项目(如果在上面的步骤中没有返回,std::set
也会这样做。)
答案 1 :(得分:2)
要跟进Jerry的回答,请注意std::set
和std::multiset
假设这些元素可通过operator<
operator==
进行比较。特别是,元素不必在std::set
下具有可比性。 std::multiset
仅允许非等效元素,而A
允许添加等效元素。这与平等/不平等略有不同。每当B
时,两个元素!(A < B) && !(B < A)
和std::set::insert
都是等效的,后一个条件由#include <iostream>
#include <set>
struct Foo
{
int _x, _y, _z;
Foo(int x, int y, int z): _x(x), _y(y), _z(z) {}
bool operator<(const Foo& rhs) const // weak majorization
{
return (_x < rhs._x) && (_x + _y < rhs._x + rhs._y) &&
(_x + _y + _z < rhs._x + rhs._y + rhs._z) ;
}
};
int main()
{
std::set<Foo> setFoo;
// try to insert 2 equivalent elements
setFoo.insert(Foo{1, 2, 3});
if(setFoo.insert(Foo{1, 2, 0}).second == false) // failed to insert
std::cout << "Equivalent element already in the set!" << std::endl;
}
检查,如果为true,则不插入元素。
{{1}}