在C++ STL中的unordered_map emplace()
在C++ STL中,unordered_map
是一种无序关联容器,用于存储键值对。 在操作unordered_map
时,我们可以使用许多不同的功能和方法来操作其元素。其中之一是std::unordered_map::emplace
。
std::unordered_map::emplace
方法是一个向unordered_map
插入键/值对的高效方法,它通过在容器中直接构造一个元素来避免了构造一个对象,然后再移动或副本它。这使得它比使用传统的插入函数快很多。以下是unordered_map::emplace
的基本语法:
std::pair<iterator,bool> emplace(const key_type& k, Args&&... args);
我们可以看到,emplace()
方法有两个关键参数:键k
和构造函数参数args
。通过这些参数,我们可以在unordered_map
中为一个键构造一个新的值。让我们看一个例子:
#include <iostream>
#include <unordered_map>
#include <string>
int main() {
std::unordered_map<std::string, int> prices;
prices.emplace("apple", 50);
prices.emplace("banana", 40);
prices.emplace("orange", 30);
std::cout << "Prices:" << std::endl;
for (const auto& p : prices) {
std::cout << p.first << " : " << p.second << std::endl;
}
return 0;
}
输出结果如下:
Prices:
banana : 40
orange : 30
apple : 50
在这个示例中,我们使用emplace()
方法向prices
映射中添加了三个键值对,其中每个值都是一个整数。 注意,构造函数参数是可变参数。 这样我们可以使用任何构造函数的任何数量的参数,如下所示:
#include <iostream>
#include <unordered_map>
#include <string>
class Person {
public:
Person(const std::string& n, const std::string& addr, int phone) : name(n), address(addr), phone_number(phone) { }
private:
std::string name;
std::string address;
int phone_number;
};
int main() {
std::unordered_map<std::string, Person> people;
people.emplace("John", "123 Main St", 1234567890);
people.emplace("Jane", "456 Maple Ave", 9876543210);
return 0;
}
在这个示例中,我们使用了一个自定义的Person
类,该类有一个接受三个参数的构造函数。 我们使用emplace()
方法创建了两个键值对,每个值都是一个新的Person
实例,其中每个实例有三个构造函数参数。
值得注意的是,对于支持emplace()
方法的容器,该方法几乎总是比insert()
方法快得多。 这是因为emplace()
避免了不必要的副本,从而更高效地使用了内存。
结论
std::unordered_map::emplace
是一个高效的方法,可用于将新键/值对插入unordered_map
容器中。 与insert()
方法相比,它更有效地利用了内存,并且可以使用具有任意构造函数参数的类或结构体来构造新的容器元素。 在编写高性能C++代码时,考虑使用emplace()
方法以获得更快的执行速度。