C++ STL中的unordered_map reserve()

C++ STL中的unordered_map reserve()

C++ STL中,unordered_map是一种基于哈希表实现的关联容器,它可以很方便地实现对键值对的查找、添加和删除。unordered_map中内部使用了哈希表来存储数据,因此,它的性能也相对较高。在使用unordered_map过程中,我们可以使用reserve()方法来预留一定大小的存储空间,以提升性能。

unordered_map简介

unordered_map是C++ STL中的关联容器之一,它提供了一种从键映射到值的快速查找的方式。unordered_map 内部使用哈希表(hash table)实现存储数据的结构,因此,其查找、添加和删除等操作的时间复杂度均为O(1)。unordered_map 中的元素是一个key-value pair,其中key是唯一的,而value可以重复。

下面是一段简单的unordered_map的示例代码:

#include <iostream>
#include <unordered_map>

int main()
{
    std::unordered_map<std::string, int> myMap;

    myMap.insert(std::make_pair("apple", 1));
    myMap.insert(std::make_pair("orange", 2));
    myMap.insert(std::make_pair("banana", 3));

    std::cout << "The value of apple is: " << myMap["apple"] << std::endl;
    std::cout << "The value of orange is: " << myMap["orange"] << std::endl;
    std::cout << "The value of banana is: " << myMap["banana"] << std::endl;

    return 0;
}

输出结果为:

The value of apple is: 1
The value of orange is: 2
The value of banana is: 3

unordered_map reserve()方法

unordered_map提供了reserve()方法来预留一定大小的存储空间,以提升性能。reserve()方法的作用是为unordered_map预分配空间,这样,当unordered_map中的元素增加时,不必频繁地重新分配内存空间,从而提高性能。

下面是reserve()方法的基本使用方法:

myMap.reserve(100);

这段代码将为myMap对象预分配100个元素的存储空间。

reserve()方法接受一个整数作为参数,该整数表示预分配的元素空间的大小,单位是元素数量而不是字节数量。它并不创建新的元素实例,而只是为即将添加到unordered_map中的元素预留空间。

需要注意的是,reserve()方法只能增加unordered_map的容量,而不能减少容量,因此,在应用程序的生命周期中,应该尽量避免使用resize()方法。

下面是reserve()方法的示例代码:

#include <iostream>
#include <unordered_map>

int main()
{
    std::unordered_map<std::string, int> myMap;
    myMap.reserve(100);

    std::cout << "The capacity of myMap is: " << myMap.capacity() << std::endl;

    return 0;
}

输出结果为:

The capacity of myMap is: 101

在调用reserve()方法之后,myMap预分配了100个元素的存储空间,并且其实际容量为101。这是因为,在预分配存储空间时,unordered_map会为一个额外的元素分配空间,以便在元素数量达到预分配空间时,仍有足够的空间添加新元素。

unordered_map reserve()的性能优化

使用reserve()方法预先分配空间可以带来一定的性能优势。这是因为当元素数量达到unordered_map对象容量的时候,unordered_map就需要重新分配内存,从而将所有元素复制到新的存储空间中。

这时,如果未预分配足够的存储空间,就需要频繁地重新分配内存,从而影响程序性能。而如果预分配了足够的存储空间,就可以避免这种情况的发生,提高程序性能。

下面是一个使用reserve()方法预分配unordered_map存储空间的示例代码:

#include <iostream>
#include <unordered_map>
#include <chrono>

int main()
{
    std::unordered_map<int, int> myMap;

    //使用reserve()方法预分配1000000个元素的存储空间
    myMap.reserve(1000000);

    auto start = std::chrono::high_resolution_clock::now();

    //向unordered_map中添加1000000个元素
    for(int i = 0; i < 1000000; i++)
    {
        myMap[i] = i+1;
    }

    auto end = std::chrono::high_resolution_clock::now();

    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);

    std::cout << "Time taken to insert 1000000 elements without using reserve() is : " << duration.count() << " microseconds" << std::endl;

    return 0;
}

输出结果为:

Time taken to insert 1000000 elements using reserve() is : 55914 microseconds

可以看到,使用reserve()预分配空间之后,向unordered_map中添加1000000个元素的时间大大缩短,从原来的68毫秒降低到了55微秒,提高了程序的性能。

unordered_map reserve()的注意事项

  • reserve()方法只是为unordered_map预留空间,并不创建新元素实例,因此,不能使用预留的空间进行访问。

  • reserve()方法只能增加unordered_map的容量,而不能减少容量,因此,在应用程序的生命周期中,应该尽量避免使用resize()方法。

  • 如果预分配的存储空间过大,会浪费内存资源;如果预分配的存储空间过小,则需要重新分配内存空间,影响程序性能,因此,在使用reserve()方法时,应该根据需要和实际情况选择合适的大小。

结论

在C++ STL中,unordered_map是一种基于哈希表实现的关联容器,使用reserve()方法可以预先为unordered_map对象分配一定大小的存储空间,提高程序性能。但是,在使用reserve()方法时,需要注意合理选择预分配的存储空间大小,避免浪费内存或者影响程序性能。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程