STL教程(六)——multiset

如需转载,请注明出处。

Multisets是一种类似于set的关联容器,但多个元素可以具有相同的值。

Multisets是C ++ STL(标准模板库)的一部分。 Multisets是关联容器,如Set,用于存储排序值(值本身就是T类型的键),但与Set只存储唯一键的Set不同,multiset可以有重复键。默认情况下,它使用‘<’运算符来比较键。

可以插入或删除多集中元素的值,但不能更改(元素始终为const)。

与multiset相关的一些基本函数:

begin() - 返回multiset中第一个元素的迭代器
end() - 返回多重集中最后一个元素后面的理论元素的迭代器
size() - 返回多集中元素的数量
max_size() - 返回多集可以容纳的最大元素数
empty() - 返回multiset是否为空

例子1:

#include <iostream> 
#include <set> 
#include <iterator> 

using namespace std; 

int main() 
{ 
	// empty multiset container 
	multiset <int, greater <int> > gquiz1;		 

	// insert elements in random order 
	gquiz1.insert(40); 
	gquiz1.insert(30); 
	gquiz1.insert(60); 
	gquiz1.insert(20); 
	gquiz1.insert(50); 
	gquiz1.insert(50); // 50 will be added again to the multiset unlike set 
	gquiz1.insert(10); 

	// printing multiset gquiz1 
	multiset <int, greater <int> > :: iterator itr; 
	cout << "\nThe multiset gquiz1 is : "; 
	for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) 
	{ 
		cout << '\t' << *itr; 
	} 
	cout << endl; 

	// assigning the elements from gquiz1 to gquiz2 
	multiset <int> gquiz2(gquiz1.begin(), gquiz1.end()); 

	// print all elements of the multiset gquiz2 
	cout << "\nThe multiset gquiz2 after assign from gquiz1 is : "; 
	for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) 
	{ 
		cout << '\t' << *itr; 
	} 
	cout << endl; 

	// remove all elements up to element with value 30 in gquiz2 
	cout << "\ngquiz2 after removal of elements less than 30 : "; 
	gquiz2.erase(gquiz2.begin(), gquiz2.find(30)); 
	for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) 
	{ 
		cout << '\t' << *itr; 
	} 

	// remove all elements with value 50 in gquiz2 
	int num; 
	num = gquiz2.erase(50); 
	cout << "\ngquiz2.erase(50) : "; 
	cout << num << " removed \t" ; 
	for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) 
	{ 
		cout << '\t' << *itr; 
	} 

	cout << endl; 

	//lower bound and upper bound for multiset gquiz1 
	cout << "gquiz1.lower_bound(40) : "
		<< *gquiz1.lower_bound(40) << endl; 
	cout << "gquiz1.upper_bound(40) : "
		<< *gquiz1.upper_bound(40) << endl; 

	//lower bound and upper bound for multiset gquiz2 
	cout << "gquiz2.lower_bound(40) : "
		<< *gquiz2.lower_bound(40) << endl; 
	cout << "gquiz2.upper_bound(40) : "
		<< *gquiz2.upper_bound(40) << endl; 
		
		return 0; 

} 

上述程序的输出是:

The multiset gquiz1 is :  60 	50	50	40	30	20	10

The multiset gquiz2 after assign from gquiz1 is :  10	 20	30	40	50	50	60

gquiz2 after removal of elements less than 30 :  30	40	50	50	60
gquiz2.erase(50) : 2 removed 		30	40	60
gquiz1.lower_bound(40) : 40
gquiz1.upper_bound(40) : 30
gquiz2.lower_bound(40) : 40
gquiz2.upper_bound(40) : 60

例子2:

#include <iostream>  
#include <set>  
#include <iterator>  
  
using namespace std;  
  
int main()  
{  
    // empty multiset container  
    multiset <int, greater <int> > ms1;   
      
    // insert elements in random order  
    ms1.insert(400);  
    ms1.insert(300);  
    ms1.insert(600);  
    ms1.insert(200);  
    ms1.insert(500);  
    ms1.insert(500); // 500 will be added again to the multiset unlike set  
    ms1.insert(100);  
      
    // printing multiset ms1  
    multiset <int> :: iterator itr;  
      
    cout << "\nMarks of ms1 class Room: "<<endl;  
    for (itr = ms1.begin(); itr != ms1.end(); ++itr)  
    {  
        cout << "  " << *itr;  
    }  
    cout << endl;  
      
    // assigning the elements from ms1 to ms2  
    multiset <int> ms2(ms1.begin(), ms1.end());  
      
    // print all elements of the multiset ms2  
    cout << "\nThe Number of students in class Room after assigning Class Room students: "<<endl;  
    for (itr = ms2.begin(); itr != ms2.end(); ++itr)  
    {  
        cout << "  " << *itr;  
    }  
    cout << endl;  
      
    // Find the highest element in multiset ms1 and ms2  
    multiset<int>::iterator msIt1, msIt2;  
    msIt1 =  ms1.begin();  
    cout<< "\nHighest marks in ms1 Class Room: "<<*msIt1;   
      
    msIt2 =  ms2.begin();  
    cout<< "\nHighest marks in ms2 Class Room: "<<*msIt2;   
          
    // remove all elements up to element with value 300 in ms2  
    cout << "\n\nms2 Class Room after removal of Students less than 300 marks:\n ";  
    ms2.erase(ms2.begin(), ms2.find(300));  
    for (itr = ms2.begin(); itr != ms2.end(); ++itr)  
    {  
      cout << "  " << *itr;  
    }  
      
    // remove all elements with value 500 in ms2  
    int num;  
    num = ms2.erase(500);  
    cout << "\n\nms2.erase(500) : ";  
    cout << num << " removed \t" ;  
    for (itr = ms2.begin(); itr != ms2.end(); ++itr)  
    {  
        cout << "  " << *itr;  
    }  
        
    cout << endl<<endl;  
    //lower bound and upper bound for multiset ms1  
    cout << "ms1.lower_bound(400) : " << *ms1.lower_bound(400) << endl;  
    cout << "ms1.upper_bound(400) : " << *ms1.upper_bound(400) << endl;  
    //lower bound and upper bound for multiset ms2  
    cout << "ms2.lower_bound(400) : " << *ms2.lower_bound(400) << endl;  
    cout << "ms2.upper_bound(400) : " << *ms2.upper_bound(400) << endl;  
      
return 0;  
}  

输出: 

Marks of ms1 class Room: 
  600  500  500  400  300  200  100

The Number of students in class Room after assigning Class Room students: 
  100  200  300  400  500  500  600

Highest marks in ms1 Class Room: 600
Highest marks in ms2 Class Room: 100

ms2 Class Room after removal of Students less than 300 marks:
   300  400  500  500  600

ms2.erase(500) : 2 removed 	  300  400  600

ms1.lower_bound(400) : 400
ms1.upper_bound(400) : 300
ms2.lower_bound(400) : 400
ms2.upper_bound(400) : 600

Multiset的功能列表:

begin() - 返回multiset中第一个元素的迭代器。
end() - 返回多重集中最后一个元素后面的理论元素的迭代器。
size() - 返回多集中元素的数量。
max_size() - 返回多集可以容纳的最大元素数。
empty() - 返回multiset是否为空。
pair insert(const g) - 向multiset添加一个新元素'g'。
iterator insert(iterator position,const g) - 在迭代器指向的位置添加一个新元素“g”。
erase(iterator position) - 删除迭代器指向的位置处的元素。
erase(const g) - 从multiset中删除值'g'。
clear() - 从多集中删除所有元素。
key_comp()/ value_comp() - 返回确定多个集合中元素的排序方式的对象(默认情况下为“<”)。
find(const g) - 如果找到则返回multiset中元素'g'的迭代器,否则返回迭代器结束。
count(const g) - 返回多集中元素“g”的匹配数。
lower_bound(const g) - 返回第一个元素的迭代器,它等同于'g',或者肯定不会在multiset中的元素'g'之前。
upper_bound(const g) - 返回第一个元素的迭代器,它等同于'g',或者肯定会在multiset中的元素'g'之后。
swap() - 此函数用于交换两个多重集的内容,但这些集必须是相同的类型,尽管大小可能不同。
operator =  - 此运算符用于通过替换现有内容将新内容分配给容器。
emplace() - 此函数用于将新元素插入到多集合容器中。
equal_range() - 返回对的迭代器。该对指的是包含容器中具有等于k的键的所有元素的范围。
emplace_hint() - 在多集中插入一个新元素。
rbegin() - 返回指向多集合容器中最后一个元素的反向迭代器。
rend() - 返回指向多集合容器中第一个元素之前的理论元素的反向迭代器。
cbegin() - 返回指向容器中第一个元素的常量迭代器。
cend() - 返回一个指向容器中最后一个元素之后的位置的常量迭代器。
crbegin() - 返回指向容器中最后一个元素的常量反向迭代器。
crend() - 返回一个指向容器中第一个元素之前位置的常量反向迭代器。
get_allocator() - 返回与multiset关联的allocator对象的副本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值