在C++中,默认情况下,std::set
和std::multiset
都使用std::less<T>
作为它们的比较器。有没有人可以解释一下为什么std::multiset
允许重复元素,而std::set
不允许呢?
在C++中,默认情况下,std::set
和std::multiset
都使用std::less<T>
作为它们的比较器。有没有人可以解释一下为什么std::multiset
允许重复元素,而std::set
不允许呢?
upper_bound
开始,以找到新项的正确插入点。std::set
检查是否找到了一个键等于新键的现有项,如果是,则返回并发出失败信号。
std::multiset
只在该点插入新项(如果它没有在上一步返回,则std::set
也会这样做)。std::set
和std::multiset
假定元素可通过operator<
进行比较,满足严格弱序。特别地,元素不必在operator==
下可比较。std::set
仅允许非等价元素,而std::multiset
除此之外还允许等价元素。这与相等/非相等稍有不同。当且仅当!(A < B) && !(B < A)
时,两个元素A
和B
是等价的,而std::set::insert
会检查这个条件,如果为真,则不插入该元素。
示例{{link2:在Ideone上实时运行}}
#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;
}
operator<
(严格弱排序)但未定义operator==
的类型。 - vsoftcoupper_bound
的返回值可以有效地用作insert
的提示? - Lingxi