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";
} 输出结果

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";
}
} 输出结果:

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";
} 输出结果:

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";
} 输出结果:

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";
} 运行结果:

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";
}
} 运行结果:

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";
} 运行结果:

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";
} 运行结果:


京公网安备 11010502036488号