multiset是关联容器,是排好序的集合,并且集合中的元素可以重复
因为是关联容器,所以想要更改一个元素的值需要先删除再添加。
类模板
multiset类模板定义如下:
template <class Key, class Pred = less<Key>, class B = allocator<Key> > class multiset {
...
};
第一个参数 Key
是元素类型,第二个参数Pred
是容器中元素的排序规则,可以是函数对象类也可以是函数指针类。第三个参数一般不适用。
在排序时使用Pred
参数来判断大小,Pred是用 <
运算符来判断的,所以元素类型应该可以进行 <
比较,即必要时重载 < 运算符。
Pred
参数默认是 less
,less是函数对象类模板,定义如下:
template <class_Tp>
struct less
{
bool operator() (const _Tp &__x, const _Tp &__y) const
{ return __x < __y; }
};
less<类型>
是从小到大排序,greater<类型>
是从大到小排序
常用成员函数
成员函数或成员函数模板 | 作 用 |
---|---|
iterator find (const T & val); | 在容器中查找第一个值为 val 的元素,返回其迭代器。如果找不到,返 回 end() |
iterator insert( const T & val); | 将 val 插入容器中并返回其迭代器 |
void insert(iterator first, iterator last); | 将区间 [first, last) 中的元素插人容器 |
int count( const T & val); | 统计有多少个元素的值和 val 相等 |
iterator lower_bound( const T & val); | 查找一个最大的位置 it,使得 [begin(), it) 中所有的元素者比 val 小 |
iterator upper_bound( const T & val); | 查找一个最小的位置 it,使得 [it, end()) 中所有的元素都比 val 大 |
pair <iterator, iterator > equal_range (const T & val); | 同时求得 lower_bound 和 upper_bound |
iterator erase(iterator it); | 删除 it 指向的元素,返回其后面的元素的迭代器(Visual Studio 2010 中如此,但是在 C++ 标准和 Dev C++ 中,返回值不是这样) |
iterator erase(iterator first, iterator last); | 删除区间 [first, last),返回 last(Visual Studio 2010 中如此,但是在 C++ 标准和 Dev C++ 中,返回值不是这样) |
在比较大小时用的是 < 和 > 同时为假,而不是 ==
set
与multiset的唯一区别就是不能有重复元素
另外
insert成员函数为
pair<iterator, bool> insert(const T & val);
pair第二个参数(second
)为是否插入成功,插入成功第一个参数(first
)指向插入元素迭代器。没有插入成功指向原有元素迭代器。