📜  带有示例的 C++ 中的无序元组集(1)

📅  最后修改于: 2023-12-03 15:39:25.054000             🧑  作者: Mango

带有示例的 C++ 中的无序元组集

在 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 之后,您可以将它应用于您的代码中,以提高代码的性能。