multiset多重集合容器

跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,只是multiset多重集合容器允许将重复的元素键值插入。元素的搜索依然具有对数级的算法时间复杂度,find和equal_range函数可以搜索出某一键值下的所有元素位置。

创建multiset对象

有以下几种方式。

(1)    multiset()

multiset<int> ms;

(2)    multiset(constkey_compare&cmp)

//student结构体

structstudent{

int id;

char *name;

};

//比较函数

structstuLess{

bool oprator()(const student &s1,conststudent &s2){

           return s1.id<s2.id;

}

};

//创建multiset对象

multiset<student,stuLess> ms(stuLess);

(3)    multiset(const multiset&)

//multiset<int> ms1;

multiset<int> ms2(ms1);

(4)    miltiset(InputIteratorfirst,InputIterator last)

int array[]={1,2,3,4,5};

multiset<int> ms(array,array+5);

(5)    miltiset(InputIteratorfirst,InputIterator last, const key_compare&cmp)

student stuArray[]={{1,”li”},{2,”shi”},{3,”wang”}};

multiset<student,stuLess> ms(stuArray,stuArray+3,stuLess());

插入

multiset的插入函数与set类似,一般用insert,有三种形式。

(1)    iterator insert(constvalue_type&v)

(2)    iterator insert(iterator pos, constvalue_type&v)

(3)    void insert(InputIteratorfirst,InputIterator last)

删除

multiset的元素删除与set容器的删除完全一致,主要是erase和clear函数。

遍历

利用迭代器进行遍历访问元素。


#include<iostream>
#include<set>
using namespace std;
int main()
{
	multiset<int> ms;
	//无序输入 
	ms.insert(1);
	ms.insert(21);
	ms.insert(11);
	ms.insert(10);
	ms.insert(9);
	ms.insert(9);
	multiset<int>::iterator begin,end;
	end=ms.end();
	for(begin=ms.begin();begin!=end;begin++)
	{
		cout<<*begin<<" ";//有序输出 
	}
	cout<<endl;
	return 0;
}

反向遍历

利用反向迭代器reverse_iterator和const_reverse_iterator进行反向迭代,降序输出。

#include<iostream>
#include<set>
using namespace std;
int main()
{
	multiset<int> ms;
	ms.insert(1);
	ms.insert(1);
	ms.insert(5);
	ms.insert(4);
	ms.insert(1);
	multiset<int>::reverse_iterator rbegin,rend;
	rend=ms.rend();
	for(rbegin=ms.rbegin();rbegin!=rend;rbegin++)
	{
		cout<<*rbegin<<" ";
	}
	cout<<endl;
	return 0;
}

元素的搜索

find函数返回第一个搜索到的元素的位置,如果元素不存在,则返回end结束元素位置。equal_range函数则返回一个可以指示相等元素范围区间的pair对象。原型如下:

(1)    iterator find(constkey_type&k)

(2)    pair<iterator,iterator>equal_range(constkey_type&k)

返回一个pair对象,其first变量值为lower_bound(k),second变量值为upper-bound(k),分别指向大于等于k(x>=k)和大于k(x>k)的第一个元素位置,即给出相等元素的位置范围。

#include<iostream>
#include<set>
using namespace std;
int main()
{
	multiset<int> ms;
	ms.insert(11);
	ms.insert(21);
	ms.insert(10);
	ms.insert(11);
	ms.insert(11);
	ms.insert(11);
	ms.insert(9);
	int v=9;
	multiset<int>::iterator i_v=ms.find(v);
	cout<<*i_v<<endl;
	v=11;
	pair<multiset<int>::iterator,multiset<int>::iterator>p=ms.equal_range(v);
	cout<<"大于等于"<<v<<"的第一个元素为"<<*p.first<<endl;
	cout<<"大于"<<v<<"的第一个元素为"<<*p.second<<endl;
	//打印重复键值元素11
	multiset<int>::iterator i;
	cout<<"键值为"<<v<<"的所有元素为";
	for(i=p.first;i!=p.second;i++)
	{
		cout<<*i<<" ";
	} 
	return 0;
}


其他函数

其他常用的函数有empty、size、count、lower_bound、upper_bound等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值