【发布时间】:2022-11-27 14:57:52
【问题描述】:
// CPP Program to demonstrate the
// implementation of multiset
#include <iostream>
#include <iterator>
#include <set>
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);
// 50 will be added again to
// the multiset unlike set
gquiz1.insert(50);
gquiz1.insert(10);
// printing multiset gquiz1
multiset<int, greater<int> >::iterator itr;
cout << "\nThe multiset gquiz1 is : \n";
for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) {
cout << *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 \n"
"after assign from gquiz1 is : \n";
for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
cout << *itr << " ";
}
cout << endl;
// remove all elements up to element
// with value 30 in gquiz2
cout << "\ngquiz2 after removal \n"
"of elements less than 30 : \n";
gquiz2.erase(gquiz2.begin(), gquiz2.find(30));
for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
cout << *itr << " ";
}
// remove all elements with value 50 in gquiz2
int num;
num = gquiz2.erase(50);
cout << "\ngquiz2.erase(50) : \n";
cout << num << " removed \n";
for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
cout << *itr << " ";
}
cout << endl;
// lower bound and upper bound for multiset gquiz1
cout << "\ngquiz1.lower_bound(40) : \n"
<< *gquiz1.lower_bound(40) << endl;
cout << "gquiz1.upper_bound(40) : \n"
<< *gquiz1.upper_bound(40) << endl;
// lower bound and upper bound for multiset gquiz2
cout << "gquiz2.lower_bound(40) : \n"
<< *gquiz2.lower_bound(40) << endl;
cout << "gquiz2.upper_bound(40) : \n"
<< *gquiz2.upper_bound(40) << endl;
return 0;
}
gquiz1 的上限打印 30,key 为 40。gquiz2 上限似乎只给出更高的值。我认为这与 multiset gquiz1 中的多个相似元素有关,但是在所有擦除函数之后在 gquiz2 中插入 50 两次时,gquiz2 上限仍然给出比键更高的值,而 gquiz1 给出更低的值。请帮助。
修改两次插入50的代码。 我试过插入 50 两次代码:
// CPP Program to demonstrate the
// implementation of multiset
#include <iostream>
#include <iterator>
#include <set>
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);
// 50 will be added again to
// the multiset unlike set
gquiz1.insert(50);
gquiz1.insert(10);
// printing multiset gquiz1
multiset<int, greater<int> >::iterator itr;
cout << "\nThe multiset gquiz1 is : \n";
for (itr = gquiz1.begin(); itr != gquiz1.end(); ++itr) {
cout << *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 \n"
"after assign from gquiz1 is : \n";
for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
cout << *itr << " ";
}
cout << endl;
// remove all elements up to element
// with value 30 in gquiz2
cout << "\ngquiz2 after removal \n"
"of elements less than 30 : \n";
gquiz2.erase(gquiz2.begin(), gquiz2.find(30));
for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
cout << *itr << " ";
}
// remove all elements with value 50 in gquiz2
int num;
num = gquiz2.erase(50);
cout << "\ngquiz2.erase(50) : \n";
cout << num << " removed \n";
for (itr = gquiz2.begin(); itr != gquiz2.end(); ++itr) {
cout << *itr << " ";
}
gquiz2.insert(50);
gquiz2.insert(50);
cout << endl;
// lower bound and upper bound for multiset gquiz1
cout << "\ngquiz1.lower_bound(40) : \n"
<< *gquiz1.lower_bound(40) << endl;
cout << "gquiz1.upper_bound(40) : \n"
<< *gquiz1.upper_bound(40) << endl;
// lower bound and upper bound for multiset gquiz2
cout << "gquiz2.lower_bound(40) : \n"
<< *gquiz2.lower_bound(40) << endl;
cout << "gquiz2.upper_bound(40) : \n"
<< *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) :
30
实际的:
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) :
50
【问题讨论】:
标签: c++ multiset lower-bound upperbound