如需转载,请注明出处。
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对象的副本。