C ++ std :: set和std :: multiset

时间:2015-05-20 02:36:11

标签: c++ set containers std multiset

默认情况下,在C ++中,std::setstd::multiset都有std::less<T>作为比较器。任何人都可以解释一下std::multiset如何允许重复,而std::set不允许?

2 个答案:

答案 0 :(得分:6)

两者都以现有内容的等效upper_bound开头,以便为新项找到正确的插入点。

std::set然后检查是否找到了一个密钥等于新密钥的现有项目,如果是,则返回信令失败。

std::multiset只需在该点插入新项目(如果在上面的步骤中没有返回,std::set也会这样做。)

答案 1 :(得分:2)

要跟进Jerry的回答,请注意std::setstd::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,则不插入元素。

示例strict weak ordering

{{1}}