在C++中set,multiset,unordered_set,和unordered_multiset的区别
在C++标准模板库中,set,multiset,unordered_set,和unordered_multiset被用来存储元素。虽然它们相似,但在某些功能上不同。下面讨论了它们的差异。
1. Set: Set是关联容器,按特定顺序存储唯一元素。 以下是set的属性:
- 按排序顺序存储值。
- 仅存储唯一值。
- 只能插入或删除元素,不能修改元素。
- 我们可以通过给定开始迭代器和结束迭代器位置来删除多个元素。
- 使用迭代器遍历。
- Set使用二叉搜索树实现。
语法:
set<datatype> setname;
以下示例演示set的应用。
// CPP program to demonstrate insert and
// delete in set
#include <bits/stdc++.h>
using namespace std;
// Driver code
int main()
{
// set declare
set<int> s;
// Elements added to set
s.insert(12);
s.insert(10);
s.insert(2);
// duplicate added
s.insert(10);
s.insert(90);
s.insert(85);
s.insert(45);
// Iterator declared to traverse
// set elements
set<int>::iterator it, it1, it2;
cout << "Set elements after sort and "
"removing duplicates:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
cout << '\n';
it1 = s.find(10);
it2 = s.find(90);
// elements from 10 to elements before
// 90 erased
s.erase(it1, it2);
cout << "Set Elements after erase:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
return 0;
}
输出
Set elements after sort and removing duplicates:
2 10 12 45 85 90
Set Elements after erase:
2 90
2. Multisets: Multisets是关联容器,存储具有等价值的多个元素,按特定顺序排序。以下是multisets的属性:
- 按排序顺序存储元素。
- 它允许存储多个元素。
- 我们可以通过给定开始迭代器和结束迭代器来删除多个元素。
注意: 其他所有属性与set相似。
语法:
multiset<datatype> multisetName;
以下示例演示了multiset的应用。
// CPP program to demonstrate insert and
// delete in set
#include <bits/stdc++.h>
using namespace std;
// Driver Code
int main()
{
// multiset declare
multiset<int> s;
// Elements added to set
s.insert(12);
s.insert(10);
s.insert(2);
// duplicate added
s.insert(10);
s.insert(90);
s.insert(85);
s.insert(45);
// Iterator declared to traverse
// set elements
multiset<int>::iterator it, it1, it2;
cout << "Multiset elements after sort\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
cout << '\n';
it1 = s.find(10);
it2 = s.find(90);
// elements from 10 to elements before 90
// erased
s.erase(it1, it2);
cout << "Multiset Elements after erase:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
return 0;
}
输出
排序后的多重集合元素
2 10 10 12 45 85 90
删除后的多重集合元素:
2 90
3. 无序集合: 无序集合是一种关联容器,可以以任意顺序存储唯一的元素。以下是无序集合的特点: ****
- 元素可以按任意顺序存储(没有排序顺序)。
- 仅存储唯一值。
- 使用哈希表存储元素。
- 我们只能删除给定迭代器位置的元素。
注意: 所有其他属性与集合相似。
语法:
unordered_set<datatype> setname;
以下示例演示了无序集合的应用。
// CPP程序演示在unordered_set中插入和
//删除
#include <bits/stdc++.h>
using namespace std;
int main()
{
// 声明unordered_set
unordered_set<int> s;
// 向集合中添加元素
s.insert(12);
s.insert(10);
s.insert(2);
// 添加重复的
s.insert(10);
s.insert(90);
s.insert(85);
s.insert(45);
s.insert(12);
s.insert(70);
// 声明迭代器遍历集合元素
unordered_set<int>::iterator it, it1;
cout << "无序集合排序后的元素:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
cout << '\n';
it1 = s.find(10);
//删除元素10
s.erase(it1);
cout << "删除后的无序集合元素:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
return 0;
}
输出
无序集合排序后的元素:
10 45 12 70 2 90 85
删除后的无序集合元素:
45 12 70 2 90 85
4. 无序多重集合: 无序多重集合是一个包含一组非唯一元素的关联容器,其元素没有排序顺序。以下是无序多重集合的特点:
- 元素可以按任意顺序存储。
- 可以存储重复的元素。
- 使用哈希表存储元素。
- 我们只能删除给定迭代器位置的元素。
注意: 所有其他属性与集合相似。
语法:
unordered_multiset<datatype> multisetName;
以下示例演示了无序多重集合的应用。
// CPP程序演示insert和
//从unordered_multiset中删除
#include <bits/stdc++.h>
using namespace std;
int main()
{
// unordered_multiset声明
unordered_multiset<int> s;
// 向集合中添加元素
s.insert(12);
s.insert(10);
s.insert(2);
// 添加重复元素
s.insert(10);
s.insert(90);
s.insert(85);
s.insert(45);
// 声明迭代器遍历集合元素
unordered_multiset<int>::iterator it, it1;
cout << "无序多重集合排序后的元素:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
cout << '\n';
it1 = s.find(10);
//删除元素10
s.erase(it1);
cout << "删除后的无序多重集合元素:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
return 0;
}
输出
无序多重集合排序后的元素:
10 10 45 12 90 85 2
删除后的无序多重集合元素:
45 12 90 85 2
排序后的无序多重集合元素:
45 10 10 12 2 90 85
擦除后的无序多重集合元素:
45 10 12 2 90 85
set、multiset、unordered_set和unordered_multiset之间的区别:
- 简而言之, set 是一种存储 排序并且唯一 元素的容器。如果添加了 unordered ,则表示元素 无序 。
- 如果添加了 multiset ,则表示可以 存储重复元素 。