📅  最后修改于: 2023-12-03 15:39:25.054000             🧑  作者: Mango
在 C++ 中,我们可以使用 std::unordered_set
来实现无序元组集合。这个容器实现了一个哈希表,可以将元素和哈希值存储在一起,以提高元素的访问速度。
std::unordered_set
可以存储任何类型的元素,只要它们能够被哈希。我们可以将元素定义为 std::unordered_set
的模板参数。
以下代码创建了一个 std::unordered_set
并初始化了它:
#include <unordered_set>
#include <string>
#include <iostream>
int main() {
std::unordered_set<std::string> fruits = {"apple", "banana", "orange", "grapes"};
// 打印所有元素
for (auto fruit : fruits) {
std::cout << fruit << " ";
}
std::cout << std::endl;
return 0;
}
输出:
grapes orange banana apple
如果您想要使用自定义哈希函数,则需要实现哈希函数的操作符(()
)来接受元素并生成它们的哈希值。
以下示例说明了如何为自定义类型 Person
创建一个哈希函数:
#include <unordered_set>
#include <string>
#include <iostream>
struct Person {
std::string name;
int age;
};
struct PersonHasher {
size_t operator()(const Person& p) const {
size_t hash1 = std::hash<std::string>()(p.name);
size_t hash2 = std::hash<int>()(p.age);
return hash1 ^ hash2;
}
};
int main() {
std::unordered_set<Person, PersonHasher> people = {{"Alice", 25}, {"Bob", 35}, {"Charlie", 20}};
// 打印所有元素
for (auto person : people) {
std::cout << person.name << " (" << person.age << ")" << std::endl;
}
return 0;
}
输出:
Alice (25)
Charlie (20)
Bob (35)
使用 insert()
函数向 std::unordered_set
中添加元素。您可以传递单个元素或整个容器。如果该元素已经存在,则不会执行任何操作。
使用 erase()
函数从 std::unordered_set
中删除元素。您可以传递单个元素或整个容器。
#include <unordered_set>
#include <string>
#include <iostream>
int main() {
std::unordered_set<std::string> fruits = {"apple", "banana", "orange"};
// 添加一个新元素
fruits.insert("grapes");
// 尝试添加一个已经存在的元素
fruits.insert("apple");
// 删除一个元素
fruits.erase("orange");
// 打印所有元素
for (auto fruit : fruits) {
std::cout << fruit << " ";
}
std::cout << std::endl;
return 0;
}
输出:
grapes banana apple
使用 count()
函数来查找元素。如果元素在 std::unordered_set
中,则返回 1
,否则返回 0
。使用 find()
函数也可查找元素,如果元素存在,则返回指向该元素的迭代器,否则返回 std::unordered_set::end()
。
#include <unordered_set>
#include <string>
#include <iostream>
int main() {
std::unordered_set<std::string> fruits = {"apple", "banana", "orange", "grapes"};
// 检查元素是否存在
if (fruits.count("apple")) {
std::cout << "apple is in the set" << std::endl;
} else {
std::cout << "apple is not in the set" << std::endl;
}
// 查找元素
auto it = fruits.find("banana");
if (it != fruits.end()) {
std::cout << "found " << *it << std::endl;
} else {
std::cout << "banana not found" << std::endl;
}
return 0;
}
输出:
apple is in the set
found banana
std::unordered_set
是一个高效的容器,在不同的场景下能够更快地执行查找,添加和删除元素的操作。了解了如何使用 std::unordered_set
之后,您可以将它应用于您的代码中,以提高代码的性能。