multiset 是关联容器的一种,是排序好的集合(元素已经进行了排序),并且允许有相同的元素。
不能直接修改 multiset 容器中元素的值。因为元素被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。因此,如果要修改 multiset 容器中某个元素的值,正确的做法是先删除该元素,再插入新元素。
使用 multiset 必须包含头文件 。multiset 类模板的定义如下:
template <class Key, class Pred = less<Key>, class B = allocator<Key> > class multiset {
...
};
该模板有三个类型参数:Key、Pred 和 B。类型参数可以有默认值,默认值就是某种类型。例如,Pred 类型参数的默认值就是 less 类型,B 的默认值就是 allocator 类型。
第一个类型参数说明 multiset 容器中的每个元素都是 Key 类型的。第二个类型参数 Pred 用于指明容器中元素的排序规则,在被实例化后,Pred 可以是函数对象类,也可以是函数指针类型。
multiset 内部在排序时定义了一个变量Pred op,根据表达式op(x, y)来比较两个元素 x、y 的大小。该表达式的值为 true,则说明 x 比 y 小。Pred 的默认值是 less,less 是 STL 中的函数对象类模板,其定义如下:
template <class_Tp>
struct less
{
bool operator() (const _Tp &__x, const _Tp &__y) const
{
return __x < __y; }
};
这说明,在默认情况下,multiset 容器中的元素是用<运算符比较大小的。例如,假设 A 是一个类的名字,可以定义一个如下的容器对象:
multiset <A> s;
由于 multiset 的类型参数可以使用默认值,因此上面的语句等价于:
multiset < int, less<A>, allocator<A> > s;
模板类 multiset < A, less, allocator > 的 insert 成员函数可以用来插入一个元素。 插入过程中需要进行元素之间的比较,可以认为 insert 成员函数中定义了一个变量 less op,用 op(x, y) 来比较元素 x、y 的大小。归根到底,还是用<运算符比较 x、y 的大小。 因此,<运算符必须经过适当重载,才可以向 multiset 容器中插人元素。
下面的程序 会编译出错:
#include <set>