C++中set和multiset都是关联容器,与顺序容器的差别在于,关联容器中的元素都是按照某一排序规则,有序排列的。而set与multiset的区别在于,插入set中已有元素时,忽略插入。
template<class Key,class Pred=less<Key>,class A=allocator<Key> >
class multiset{
...};
其中参数Pred可以是函数指针或者函数对象,Pred决定了“一个比另一个小”的规则。缺省情况下规则为less< Key >。less模板的定义如下:
tempalte<class T>
struct less:public binary_function<T,T,bool>
{
bool operator()(const T&x,const T&y){
return x<y;} const;};
缺省规则是普通意义上的大小比较原则,但是也可以自己定义比较的规则,比如按照个位数大小关系决定大小。
//**函数对象类定义
class A {
private:
int n;
public:
A(int n_):n(n_){
}
friend bool operator<(const A&a1, const A&a2) {
return a1.n < a2.n; }
friend ostream&operator<<(ostream&o, const A&a3) {
o << a3.n; return o; }
friend class Myless;
};
//**圆括号重载,定义比大小规则
struct Myless
{
bool operator()(const A&a1,const A&a2)
{
return (a1.n % 10) < (a2.n % 10); //按个位数比大小
}
};
typedef multiset<A> MSET1; //默认less比大小函数的关联容器
typedef multiset<A, Myless> MSET2; //以Myless定义的比大小函数的关联容器
int main()
{
const int SIZE = 6;
A a[SIZE] = {
4,22,19,8,33,40 };
MSET1 m1; //m1中元素按照从小到大排列
m1.insert(a, a + SIZE);
m1.insert(22);
//**count函数
cout << "1)" << m1.count(22) << endl;
cout << "2)";Print_interval(m1.begin(), m1.end()); //4 8 19 22 22 33 40
//**find函数
MSET1::iterator pp = m1.find(19);
if (pp != m1.end())
cout << "Found" << endl;
//**lower_bound:找最大位置it,使得[begin(),it)中所有元素小于指定值
//**upper_bound:找最小位置it,使得(it,end()]中所有元素大于指定值
cout << "3)";cout << *m1.lower_bound(22) << "," << *m1.upper_bound(22) << endl; //22 33
//**erase函数,返回迭代器为删除元素后一个元素位置
pp = m1.erase(m1.lower_bound(22), m1.upper_bound(22)); //删22 22,erase也是左闭右开,因此不包括33
cout << "4)";Print_interval(m1.begin(), m1.end()); //4 8 19 33 40
cout << "5)";cout << *pp << endl; //33
MSET2 m2; //m2中元素按照个位数从小到大排列
m2.insert(a, a + SIZE);
cout << "6)";Print_interval(m2.begin(), m2.end()); //40 22 33 4 8 9
return 0;
}
需要注意的是,erase()函数当删除某一区间时,所包含的区间也是左闭右开的区间。即区间最后一个元素不删除!