C++中set, multiset, unordered_set, unordered_multiset的区别
在c++标准模板库中,set、multiset、unordered_set、unordered_multiset用于存储元素。虽然它们在某些功能上相似但又不同。现将差异讨论如下:
set
它们是按照特定顺序存储惟一元素的关联容器。下面是集合的属性:
- 按顺序存储值。
- 仅存储惟一值。
- 元素只能插入或删除,不能修改。
- 通过指定起始迭代器和结束迭代器的位置,可以删除超过1个元素。
- 使用迭代器遍历。
- 集合被实现为二叉搜索树。
语法:
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
Multiset
它们是一种关联容器,按照特定的顺序存储具有等价值的多个元素。下面是multiset的属性:
- 按顺序存储元素。
- 它允许存储多个元素。
- 通过给出开始迭代器和结束迭代器,可以删除多于1个元素。
注意:所有其他属性都类似于这个集合。
语法:
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;
}
输出
Multiset elements after sort
2 10 10 12 45 85 90
Multiset Elements after erase:
2 90
unordered_set
它们是关联容器,以不特定的顺序存储唯一的元素。以下是Unordered_sets的属性:
- 元素可以以任何顺序存储。(无排序)
- 仅存储惟一值。
- 用于存储元素的哈希表。
- 只能擦除指定迭代器位置的元素。
注意:所有其他属性都类似于这个集合。
语法:
unordered_set<datatype> setname;
下面的例子演示了Unordered set的应用。
// CPP program to demonstrate insert and
// delete in unordered_set
#include <bits/stdc++.h>
using namespace std;
int main()
{
// unordered_set declare
unordered_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);
s.insert(12);
s.insert(70);
// Iterator declared to traverse
// set elements
unordered_set<int>::iterator it, it1;
cout << "Unordered_set elements after sort:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
cout << '\n';
it1 = s.find(10);
// element 10 erased
s.erase(it1);
cout << "Unordered_set Elements after erase:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
return 0;
}
输出:
Unordered_set elements after sort:
10 45 12 70 2 90 85
Unordered_set Elements after erase:
45 12 70 2 90 85
Unordered_multiset
这是一个关联容器,它包含一组无序的非唯一元素。以下是Unordered_multiset的属性:
- 元素可以以任何顺序存储。
- 可以存储重复的元素。
- 用于存储元素的哈希表。
- 只能擦除指定迭代器位置的元素。
注意:所有其他属性都类似于这个集合。
语法:
unordered_multiset<datatype> multisetName;
下面的例子演示了无序多集的应用。
// CPP program to demonstrate insert and
// delete in unordered_multiset
#include <bits/stdc++.h>
using namespace std;
int main()
{
// unordered_multiset declare
unordered_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
unordered_multiset<int>::iterator it, it1;
cout << "Unordered-Multiset elements after sort:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
cout << '\n';
it1 = s.find(10);
// element 10 trained
s.erase(it1);
cout << "Unordered-Multiset Elements after "
"erase:\n";
for (it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
return 0;
}
输出
Unordered-Multiset elements after sort:
45 10 10 12 2 90 85
Unordered-Multiset Elements after erase:
45 10 12 2 90 85
set, multiset, unordered_set, unordered_multiset之间的区别:
- 简单地说,set是一个容器,它存储已排序的惟一元素。如果添加了unordered,则意味着元素没有排序。
- 如果添加了multiset,意味着允许存储重复的元素。