unordered_set 是 C++ 标准库中的无序集合容器,它基于哈希表实现,提供了高效的查找、插入和删除操作。由于是无序集合,元素的存储顺序不是按照插入顺序或者元素大小排序的。
无序集合(Unordered Set):是一个不按照元素顺序存储的容器。在 unordered_set 中,元素的存储位置由哈希函数决定,因此无序集合具有快速的查找特性。
#include <unordered_set>
#include <iostream>
struct MyStruct {
int a;
double b;
MyStruct(int x, double y) : a(x), b(y) {}
};
int main() {
std::unordered_set<int> mySet;
mySet.insert(1);
mySet.insert(2);
mySet.insert(3);
for (int num : mySet) {
std::cout << num << " ";
}
std::unordered_set<MyStruct> mySet2;
// 使用 emplace 插入元素
mySet2.emplace(1, 2.5);
mySet2.emplace(2, 3.7);
mySet2.emplace(3, 4.9);
// 遍历集合并输出元素
for (const auto& elem : mySet2) {
std::cout << "a: " << elem.a << ", b: " << elem.b << std::endl;
}
std::unordered_set<MyStruct> mySet3;
// 使用 emplace_hint 插入元素
auto hint = mySet3.begin();
hint = mySet3.emplace_hint(hint, 1, 2.5);
hint = mySet3.emplace_hint(hint, 2, 3.7);
hint = mySet3.emplace_hint(hint, 3, 4.9);
// 遍历集合并输出元素
for (const auto& elem : mySet3) {
std::cout << "a: " << elem.a << ", b: " << elem.b << std::endl;
}
return 0;
}
erase(val):从无序集合中删除值为 val 的元素。
#include <unordered_set>
#include <iostream>
int main() {
std::unordered_set<int> mySet = {1, 2, 3};
mySet.erase(2);
for (int num : mySet) {
std::cout << num << " ";
}
return 0;
}
#include <unordered_set>
#include <iostream>
int main() {
std::unordered_set<int> mySet = {1, 2, 3};
if (mySet.count(2) > 0) {
std::cout << "2 exists in the set." << std::endl;
}
auto it = mySet.find(3);
if (it != mySet.end()) {
std::cout << "3 found in the set." << std::endl;
}
return 0;
}
#include <unordered_set>
#include <iostream>
int main() {
std::unordered_set<int> mySet = {1, 2, 3};
std::cout << "Size: " << mySet.size() << std::endl;
std::cout << "Is empty: " << (mySet.empty() ? "true" : "false") << std::endl;
mySet.clear();
std::cout << "Size after clear: " << mySet.size() << std::endl;
std::cout << "Is empty after clear: " << (mySet.empty() ? "true" : "false") << std::endl;
return 0;
}
#include <unordered_set>
#include <iostream>
int main() {
std::unordered_set<int> mySet = {1, 2, 3};
std::cout << "Bucket count: " << mySet.bucket_count() << std::endl;
std::cout << "Max bucket count: " << mySet.max_bucket_count() << std::endl;
for (const int& element : mySet) {
std::cout << "Element " << element << " is in bucket " << mySet.bucket(element) << std::endl;
}
std::cout << "Average bucket size: " << mySet.bucket_size() << std::endl;
return 0;
}
#include <unordered_set>
#include <iostream>
int main() {
std::unordered_set<int> mySet = {1, 2, 3};
std::cout << "Load factor: " << mySet.load_factor() << std::endl;
mySet.max_load_factor(0.7); // 设置最大负载因子
std::cout << "Max load factor: " << mySet.max_load_factor() << std::endl;
return 0;
}
#include <unordered_set>
#include <iostream>
int main() {
std::unordered_set<int> mySet = {1, 2, 3};
for (size_t i = 0; i < mySet.bucket_count(); ++i) {
std::cout << "Bucket " << i << ": ";
for (auto it = mySet.begin(i); it != mySet.end(i); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
}
return 0;
}
unordered_set 特点和优势:
(1) 无序性: 无序集合中的元素不按照插入顺序或者元素大小排序,而是根据哈希函数确定存储位置。
(2) 快速查找: 由于底层使用哈希表,查找元素的时间复杂度为平均 O(1)。
(3) 唯一性: 无序集合中的元素是唯一的,不允许重复。
unordered_map 相较于 unordered_set:
(1)元素允许重复,可以存储相同的元素多次。
其他操作都是类似的。
在算法题中,去掉重复元素,快速查找这两个特点可以有效利用起来,帮助快速解决复杂问题。
希望能更好掌握 unordered_set/multiset 的特性和使用方法。
欢迎关注🔎点赞👍收藏??留言📝