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()方法时,需要注意合理选择预分配的存储空间大小,避免浪费内存或者影响程序性能。