C++之unordered_map、map

195 阅读1分钟

unordered_map是C++标准库中的一种关联容器,它提供了快速的查找、插入和删除操作,适用于需要快速查找的场景。与map不同,unordered_map不保持元素的顺序,因此它的插入、删除和查找操作的时间复杂度为O(1)。

以下是unordered_map的一些基本用法示例:

#include <iostream> 
#include <unordered_map> 
int main() { 
        std::unordered_map<std::string, int> um; // 插入元素 
        um["apple"] = 1; 
        um["banana"] = 2; 
        um["orange"] = 3; 
        // 查找元素 
        if (um.find("banana") != um.end()) 
            { std::cout << "Found banana: " << um["banana"] << std::endl; } 
            // 删除元素 um.erase("orange"); 
            // 遍历元素 for (const auto& pair : um) { 
            std::cout << pair.first << ": " << pair.second << std::endl; 
        } 
        return 0; }

输出结果为:

Found 
banana: 2 
apple: 1 
banana: 2

在上面的示例中,我们首先创建了一个unordered_map对象,然后使用[]运算符插入了一些键值对。使用find()函数可以查找一个键是否存在,如果存在,返回一个指向该键值对的迭代器;使用erase()函数可以删除一个键值对。最后,使用for循环遍历unordered_map中的键值对,并打印出每个键和对应的值。 unordered_mapmap都是C++标准库中的关联容器,它们的主要区别在于有序性和插入、删除操作的效率。

map中的元素是按照键的顺序进行排序的,因此在进行插入、删除操作时需要维护元素的顺序,时间复杂度为O(log n)。而unordered_map中的元素是无序的,插入、删除操作的效率更高,时间复杂度为O(1)。

下面是一个示例,展示了如何使用unordered_mapmap来存储和查找学生和他们的成绩:

#include <iostream>  
#include <unordered_map>  
#include <map>  
  
struct Student {  
    std::string name;  
    int score;  
};  
  
int main() {  
    // 使用 unordered_map 存储学生信息  
    std::unordered_map<std::string, Student> um;  
  
    // 插入元素  
    um["Alice"].name = "Alice";  
    um["Alice"].score = 90;  
    um["Bob"].name = "Bob";  
    um["Bob"].score = 85;  
    um["Charlie"].name = "Charlie";  
    um["Charlie"].score = 95;  
  
    // 查找元素  
    if (um.find("Alice") != um.end()) {  
        std::cout << "Found Alice: " << um["Alice"].score << std::endl;  
    }  
  
    // 使用 map 存储学生信息  
    std::map<std::string, Student> m;  
  
    // 插入元素  
    m["Alice"].name = "Alice";  
    m["Alice"].score = 90;  
    m["Bob"].name = "Bob";  
    m["Bob"].score = 85;  
    m["Charlie"].name = "Charlie";  
    m["Charlie"].score = 95;  
  
    // 查找元素  
    if (m.find("Alice") != m.end()) {  
        std::cout << "Found Alice: " << m["Alice"].score << std::endl;  
    }  
  
    return 0;  
}

在上面的示例中,我们定义了一个Student结构体,用于存储学生的名字和成绩。首先,我们使用unordered_map来存储学生信息,并使用[]运算符插入了一些键值对。使用find()函数可以查找一个键是否存在,如果存在,返回一个指向该键值对的迭代器。然后,我们使用map来存储学生信息,插入和查找操作与unordered_map类似。由于map中的元素是有序的,因此可以通过键的顺序进行快速查找。