📅  最后修改于: 2023-12-03 14:39:52.275000             🧑  作者: Mango
在C++标准库中,unordered_map
是一个哈希表的实现,用于存储键值对。emplace()
函数是一个unordered_map
中的成员函数,用于在容器中插入元素。本文将详细介绍emplace()
函数的用法和示例,并解释其与insert()
函数的区别。
emplace()
函数的语法如下:
template<class... Args>
std::pair<iterator, bool> emplace(Args&&... args);
emplace()
函数的参数可以是键值对的构造函数参数。它会将参数直接传递给元素的构造函数,并在容器中插入构造出的元素。如果插入成功,该函数返回一个std::pair
类型的迭代器和true
。如果元素已存在于容器中,则不会插入新元素,函数返回已存在元素的迭代器和false
。
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, std::string> umap;
// 使用 emplace() 插入元素
auto [it1, success1] = umap.emplace(1, "one");
auto [it2, success2] = umap.emplace(2, "two");
auto [it3, success3] = umap.emplace(3, "three");
auto [it4, success4] = umap.emplace(1, "new_one"); // 尝试插入已存在的键
// 输出结果
std::cout << "Insertion Results:\n";
std::cout << "1: " << it1->first << " - " << it1->second << " (" << (success1 ? "success" : "failure") << ")\n";
std::cout << "2: " << it2->first << " - " << it2->second << " (" << (success2 ? "success" : "failure") << ")\n";
std::cout << "3: " << it3->first << " - " << it3->second << " (" << (success3 ? "success" : "failure") << ")\n";
std::cout << "4: " << it4->first << " - " << it4->second << " (" << (success4 ? "success" : "failure") << ")\n";
return 0;
}
输出:
Insertion Results:
1: 1 - one (success)
2: 2 - two (success)
3: 3 - three (success)
4: 1 - one (failure)
与insert()
函数相比,emplace()
函数具有以下几个区别:
emplace()
函数使用键值对的构造函数参数直接构造出元素,并插入容器,而insert()
函数则需要使用value_type
类型的对象。emplace()
函数在插入元素时可以使用移动语义,从而提高性能。insert()
函数则不能直接使用移动语义。emplace()
函数返回一个std::pair
类型的迭代器和布尔值,用于指示插入是否成功,而insert()
函数则返回一个迭代器来指向插入的元素。emplace()
函数是一个方便的unordered_map成员函数,用于在容器中插入元素。它使用键值对的构造函数参数直接构造出元素,并支持移动语义。与insert()
函数相比,emplace()
函数能提供更高的性能和更好的代码可读性。