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<Key>比大小函数的关联容器
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()函数当删除某一区间时,所包含的区间也是左闭右开的区间。即区间最后一个元素不删除!

multisetC++标准库的一个容器,它是一个有序的集合,允许重复的元素存在。它在头文件<set>定义。 multiset容器用法如下: 1. 创建multiset对象: ```cpp std::multiset<int> mySet; ``` 2. 插入元素: 使用insert()函数向multiset插入元素。由于multiset允许重复的元素存在,因此可以插入相同的元素。 ```cpp mySet.insert(10); mySet.insert(20); mySet.insert(10); ``` 3. 遍历multiset: 可以使用迭代器来遍历multiset的元素。 ```cpp for(auto it = mySet.begin(); it != mySet.end(); ++it) { std::cout << *it << " "; } ``` 4. 查找元素: 使用find()函数可以查找multiset的元素。如果找到了指定的元素,则返回指向该元素的迭代器;如果没找到,则返回end()迭代器。 ```cpp auto it = mySet.find(20); if(it != mySet.end()) { std::cout << "Found: " << *it << std::endl; } else { std::cout << "Not found" << std::endl; } ``` 5. 删除元素: 使用erase()函数可以删除multiset的元素。可以删除指定值的元素,也可以删除指定位置的元素。 ```cpp mySet.erase(10); // 删除所有值为10的元素 auto it = mySet.find(20); if(it != mySet.end()) { mySet.erase(it); // 删除指定位置的元素 } ``` multiset容器的特点是它的元素会根据特定的排序规则进行自动排序,因此在插入和删除元素时会有一定的性能开销。但是它提供了高效的查找操作,适用于需要有序且允许重复元素的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值