C++中multiset和set容器及用法

C++中set和multiset都是关联容器,与顺序容器的差别在于,关联容器中的元素都是按照某一排序规则,有序排列的。而set与multiset的区别在于,插入set中已有元素时,忽略插入

1.0 multiset类模板

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;};

缺省规则是普通意义上的大小比较原则,但是也可以自己定义比较的规则,比如按照个位数大小关系决定大小。

2.0 multiset成员函数

3.0 实例

  • 利用函数对象重定义比大小规则,按照个位数大小比较
//**函数对象类定义
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定义的比大小函数的关联容器
  • 成员函数实例(count(),find(),lower_bound,upper_bound(),erase()
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()函数当删除某一区间时,所包含的区间也是左闭右开的区间。即区间最后一个元素不删除!

你可能感兴趣的:(C++学习笔记,c++)