📜  C++ STL中的unordered_map emplace()(1)

📅  最后修改于: 2023-12-03 14:39:52.275000             🧑  作者: Mango

C++ STL中的unordered_map emplace()

在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()函数具有以下几个区别:

  1. emplace()函数使用键值对的构造函数参数直接构造出元素,并插入容器,而insert()函数则需要使用value_type类型的对象。
  2. emplace()函数在插入元素时可以使用移动语义,从而提高性能。insert()函数则不能直接使用移动语义。
  3. emplace()函数返回一个std::pair类型的迭代器和布尔值,用于指示插入是否成功,而insert()函数则返回一个迭代器来指向插入的元素。
结论

emplace()函数是一个方便的unordered_map成员函数,用于在容器中插入元素。它使用键值对的构造函数参数直接构造出元素,并支持移动语义。与insert()函数相比,emplace()函数能提供更高的性能和更好的代码可读性。