📜  c++ 映射键存在 - C++ (1)

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

C++ 映射键存在

映射键是一种将一个键映射到另一个键或值的数据结构。在 C++ 中,可以使用 std::mapstd::unordered_map 来实现映射键。

std::map

std::map 是一个有序的关联容器,它将一个键映射到一个值。插入键值对时,std::map 会根据键的顺序自动排序。以下是示例代码:

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> scores;
    scores["Alice"] = 95;
    scores["Bob"] = 75;
    scores["Charlie"] = 80;

    std::cout << "Alice's score: " << scores["Alice"] << "\n";
    std::cout << "Bob's score: " << scores["Bob"] << "\n";
    std::cout << "Charlie's score: " << scores["Charlie"] << "\n";

    return 0;
}

输出结果:

Alice's score: 95
Bob's score: 75
Charlie's score: 80

在上面的例子中,我们先定义了一个 std::map 对象 scores,它将键为 std::string 类型的学生姓名映射到键为 int 类型的成绩。然后我们插入了三对键值对,使用 std::cout 输出了每个学生的成绩。

当我们使用 std::map[key] 获取某个键的值时,如果该键不存在,std::map 会自动插入一个默认值并返回(默认值为 0)。如果我们想在获取某个键的值时,如果该键不存在,则返回一个指定的默认值,可以使用 std::map::find() 方法。示例代码如下:

#include <iostream>
#include <map>

int main() {
    std::map<std::string, std::string> phone_book = {
        {"Alice", "1234567890"},
        {"Bob", "2345678901"},
        {"Charlie", "3456789012"}
    };

    auto it = phone_book.find("David");
    if (it == phone_book.end()) {
        std::cout << "David's phone number not found\n";
    } else {
        std::cout << "David's phone number: " << it->second << "\n";
    }

    return 0;
}

输出结果:

David's phone number not found

在上面的例子中,我们先定义了一个 std::map 对象 phone_book,它将键为 std::string 类型的人名映射到键为 std::string 类型的电话号码。然后我们使用 std::map::find() 方法,查找键为 "David" 的电话号码。如果找到了电话号码,则输出。如果没有找到,则输出提示信息。

std::unordered_map

std::unordered_map 是一个无序的关联容器,它将一个键映射到一个值。插入键值对时,std::unordered_map 不会根据键的顺序进行排序。以下是示例代码:

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> scores;
    scores["Alice"] = 95;
    scores["Bob"] = 75;
    scores["Charlie"] = 80;

    std::cout << "Alice's score: " << scores["Alice"] << "\n";
    std::cout << "Bob's score: " << scores["Bob"] << "\n";
    std::cout << "Charlie's score: " << scores["Charlie"] << "\n";

    return 0;
}

输出结果:

Alice's score: 95
Bob's score: 75
Charlie's score: 80

在上面的例子中,我们先定义了一个 std::unordered_map 对象 scores,它将键为 std::string 类型的学生姓名映射到键为 int 类型的成绩。然后我们插入了三对键值对,使用 std::cout 输出了每个学生的成绩。

当我们使用 std::unordered_map[key] 获取某个键的值时,如果该键不存在,std::unordered_map 会自动插入一个默认值并返回(默认值为 0)。如果我们想在获取某个键的值时,如果该键不存在,则返回一个指定的默认值,可以使用 std::unordered_map::find() 方法。示例代码如下:

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, std::string> phone_book = {
        {"Alice", "1234567890"},
        {"Bob", "2345678901"},
        {"Charlie", "3456789012"}
    };

    auto it = phone_book.find("David");
    if (it == phone_book.end()) {
        std::cout << "David's phone number not found\n";
    } else {
        std::cout << "David's phone number: " << it->second << "\n";
    }

    return 0;
}

输出结果:

David's phone number not found

在上面的例子中,我们先定义了一个 std::unordered_map 对象 phone_book,它将键为 std::string 类型的人名映射到键为 std::string 类型的电话号码。然后我们使用 std::unordered_map::find() 方法,查找键为 "David" 的电话号码。如果找到了电话号码,则输出。如果没有找到,则输出提示信息。

总结

映射键是一个非常常见的数据结构,C++ 中可以使用 std::mapstd::unordered_map 来实现。std::map 是一个有序的关联容器,它将键按照顺序进行排序;std::unordered_map 是一个无序的关联容器,它的插入和查找操作都比 std::map 更快。在使用时,我们需要根据实际情况选择使用哪个容器。