在C++中set,multiset,unordered_set,和unordered_multiset的区别
在C++的STL库中,set,multiset,unordered_set,和unordered_multiset这4种容器都是关联容器,其中前两者是有序容器,后两者是无序容器。虽然它们都可以用来存储一系列的数值或对象,但它们之间仍然存在着一些显著的区别。
set容器
set容器里面不能存储重复的元素,其内部自动降序或升序排列,元素的插入操作会自动调整元素顺序。set容器支持在任意位置直接删除元素。
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
s.insert(5);
s.insert(3);
s.insert(1);
s.insert(9);
s.insert(7);
s.insert(7);
s.erase(3);
for (auto it = s.begin(); it != s.end(); ++it) {
cout << *it << " ";
}
return 0;
}
输出结果:1 5 7 9
multiset容器
multiset容器与set容器基本相同,区别在于multiset容器可以存储重复的元素,其内部也自动升序或降序排列,与set容器相比,multiset容器的插入操作不会自动调整元素顺序。multiset容器同样支持在任意位置直接删除元素。
#include <iostream>
#include <set>
using namespace std;
int main() {
multiset<int> ms;
ms.insert(5);
ms.insert(3);
ms.insert(1);
ms.insert(9);
ms.insert(7);
ms.insert(7);
ms.erase(ms.find(7)); // 只能删除一个7
for (auto it = ms.begin(); it != ms.end(); ++it) {
cout << *it << " ";
}
return 0;
}
输出结果:1 3 5 7 9
unordered_set容器
在C++11标准之后,增加了unordered_set容器,其内部的元素不会自动排序,因此,它的元素插入的顺序和元素之间的储存顺序并不一定相同。还需要注意的是,unordered_set容器无法排序,但是可以通过哈希算法快速检索元素。
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
unordered_set<int> us;
us.insert(5);
us.insert(3);
us.insert(1);
us.insert(9);
us.insert(7);
us.insert(7);
us.erase(3);
for (auto it = us.begin(); it != us.end(); ++it) {
cout << *it << " ";
}
return 0;
}
输出结果:5 9 7 1
unordered_multiset容器
与unordered_set相似,unordered_multiset容器也可以存储重复的元素,其内部元素也不会自动排序,但是可以借助哈希算法快速查找元素。
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
unordered_multiset<int> ums;
ums.insert(5);
ums.insert(3);
ums.insert(1);
ums.insert(9);
ums.insert(7);
ums.insert(7);
ums.erase(7); // 可以删除重复元素
for (auto it = ums.begin(); it != ums.end(); ++it) {
cout << *it << " ";
}
return 0;
}
输出结果:9 1 5 3
结论
在实际使用中,我们需要根据不同的需求选择不同的容器。如果希望数据在存储时有序且不重复,建议使用set容器;如果需要存储重复元素,可以使用multiset容器;如果数据存储时不要求有序,但是需要快速查找,可以使用unordered_set容器;如果要存储重复元素且不要求有序,可以使用unordered_multiset容器。同时需要注意的是,unordered_set和unordered_multiset容器的哈希算法在不同平台上有时会发生变化,因此,当需要在多个平台上使用时,需要格外注意。