multiset与set的区别:multiset支持重复,而set会去重
set相关知识
set和multiset的最大区别:set支持去重, multiset不支持。
set用法
1.基本操作
void run_case()
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
//输出结果按照从小到大的顺序排序
for (int x : s)
cout << x << "n";
cout << "n";
s.erase(2);
//删除一个元素,复杂度O(log(n))
for (int x : s)
cout << x << "n";
//判断一个元素是否存在
if (s.count(1))
cout << "存在n";
else
cout << "不存在n";
}
输出结果
![e65e3a7c69f6721d049bbfa59906884f.png](https://img-blog.csdnimg.cn/img_convert/e65e3a7c69f6721d049bbfa59906884f.png)
2.重载进行排序
struct node
{
int x;
int y;
};
//在 set 里面进行重载,和优先队列一样
bool operator<(const node &a, const node &b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
void run_case()
{
set<node> s;
s.insert(node{1, 1});
s.insert(node{1, 1});
s.insert(node{1, 2});
s.insert(node{1, 3});
s.insert(node{2, 2});
s.insert(node{2, 3});
for (auto t : s)
{
cout << t.x << " " << t.y << "n";
}
}
输出结果:
![926d38690272b4ad55f3d9888ee7211a.png](https://img-blog.csdnimg.cn/img_convert/926d38690272b4ad55f3d9888ee7211a.png)
3.find函数的用法
void run_case()
{
//返回迭代器位置如果没有找到返回值为最后一个元素的下一个位置,也就是end()
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
auto it = s.find(2);
cout << *it << "n";
}
输出结果:
![3fb67f54a5535e25a6f92232a9258bab.png](https://img-blog.csdnimg.cn/img_convert/3fb67f54a5535e25a6f92232a9258bab.png)
4.迭代器的用法
void run_case()
{
//返回迭代器位置如果没有找到返回值为最后一个元素的下一个位置,也就是end()
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
auto it1 = s.begin(); //指向第一个元素
auto it2 = s.rbegin(); //指向最后一个元素
auto it3 = s.end(); //指向最后一个元素的下一个位置
auto it4 = s.rend(); //指向第一个元素的前一个位置
cout << *it1 << "n";
cout << *it2 << "n";
//cout << *it3 << "n";
//cout << *it4 << "n";
for (auto x : s)
cout << x << " ";
cout << "n";
for (auto it = s.begin(); it != s.end(); it++)
cout << *it << " ";
cout << "n";
for (auto it = s.rbegin(); it != s.rend(); it++)
cout << *it << " ";
cout << "n";
}
输出结果:
![dd8a6a2985b07e89bf597d0d83e4fed0.png](https://img-blog.csdnimg.cn/img_convert/dd8a6a2985b07e89bf597d0d83e4fed0.png)
multiset用法
mutiset和set的用法十分相似,主要在于multiset不可以去重,而set可以 我们把上面set的操作用multiset跑一遍,就可以看到不同了 1.基本操作
void run_case()
{
multiset<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
//输出结果按照从小到大的顺序排序
for (int x : s)
cout << x << "n";
cout << "n";
s.erase(2);
//删除一个元素,复杂度O(log(n))
for (int x : s)
cout << x << "n";
//判断一个元素是否存在
if (s.count(1))
cout << "存在n";
else
cout << "不存在n";
}
运行结果:
![d3c0649d09929372ee411ee1155ea300.png](https://img-blog.csdnimg.cn/img_convert/d3c0649d09929372ee411ee1155ea300.png)
2.重载进行排序
struct node
{
int x;
int y;
};
//在 multiset 里面进行重载,和优先队列一样
bool operator<(const node &a, const node &b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
void run_case()
{
multiset<node> s;
s.insert(node{1, 1});
s.insert(node{1, 1});
s.insert(node{1, 2});
s.insert(node{1, 3});
s.insert(node{2, 2});
s.insert(node{2, 3});
for (auto t : s)
{
cout << t.x << " " << t.y << "n";
}
}
运行结果:
![32fd4f1aaeb34e0cae6277a0c3d41a37.png](https://img-blog.csdnimg.cn/img_convert/32fd4f1aaeb34e0cae6277a0c3d41a37.png)
3.find函数的用法
void run_case()
{
//返回迭代器位置如果没有找到返回值为最后一个元素的下一个位置,也就是end()
multiset<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
auto it = s.find(2);
cout << *it << "n";
}
运行结果:
![9acc0be029af2b5b3950fc3070bed7e9.png](https://img-blog.csdnimg.cn/img_convert/9acc0be029af2b5b3950fc3070bed7e9.png)
4.迭代器的用法
void run_case()
{
//返回迭代器位置如果没有找到返回值为最后一个元素的下一个位置,也就是end()
multiset<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
auto it1 = s.begin(); //指向第一个元素
auto it2 = s.rbegin(); //指向最后一个元素
auto it3 = s.end(); //指向最后一个元素的下一个位置
auto it4 = s.rend(); //指向第一个元素的前一个位置
cout << *it1 << "n";
cout << *it2 << "n";
//cout << *it3 << "n";
//cout << *it4 << "n";
for (auto x : s)
cout << x << " ";
cout << "n";
for (auto it = s.begin(); it != s.end(); it++)
cout << *it << " ";
cout << "n";
for (auto it = s.rbegin(); it != s.rend(); it++)
cout << *it << " ";
cout << "n";
}
运行结果:
![86cdb3a45a4027628423ebe9ad485a3a.png](https://img-blog.csdnimg.cn/img_convert/86cdb3a45a4027628423ebe9ad485a3a.png)