📜  C++ STL中的unordered_multimap emplace_hint()函数(1)

📅  最后修改于: 2023-12-03 15:13:56.803000             🧑  作者: Mango

C++ STL中的 unordered_multimap::emplace_hint()函数

在 C++ STL(标准模板库)中,unordered_multimap 是一个可以存储多个相同的键(key)的关联容器,在查找过程中具有快速的性能优势。emplace_hint()函数是unodered_multimap容器提供的一个用于插入新元素的函数,与emplace()函数类似,但提供了一个提示位置来帮助提高插入新元素的效率和性能。

函数原型
template< class... Args >
iterator emplace_hint( const_iterator hint, Args&&... args );
参数说明
  • hint:一个迭代器,指向搜索新键的开始位置,也称为建议位置。
  • args:传递给键值对的实参。键类型和对象类型必须提供。对于节点的值类型,所有额外的实参都将被转发给对象类型的构造函数。
返回值

返回一个指针指向插入的新元素。如果插入失败,会返回end()迭代器。

工作原理

emplace_hint()在包含指定键(key)的桶中寻找位置来插入新键值对。函数接收一个提示位置,并从这个位置开始查找一个适合插入新节点的桶或节点,然后插入新节点。因此,这个函数可以显著地提高插入新元素的速度和性能,特别是在容器很大的情况下。

例子
#include <iostream>
#include <string>
#include <unordered_map>

int main()
{
    std::unordered_multimap<std::string, double> example;

    // 快速插入一些数据
    example.insert({
        {"hello", 1.1},
        {"world", 2.1},
        {"hello", 3.1},
        {"hello", 4.2},
        {"world", 5.3},
        {"world", 6.3},
    });

    auto hint = example.equal_range("hello").second;

    example.emplace_hint(hint, "hello", 4.4);
    example.emplace_hint(example.end(), "test", 7.7);

    // 遍历输出所有数据
    for(auto& x: example)
    {
        std::cout << x.first << " => " << x.second << std::endl;
    }

    return 0;
}

输出如下:

hello => 1.1
hello => 3.1
hello => 4.4
hello => 4.2
test => 7.7
world => 2.1
world => 5.3
world => 6.3

在上面的例子中,我们创建了一个unordered_multimap容器,将一些数据插入其中。然后通过equal_range()函数获取了一个适当的插入提示位置,使用emplace_hint()函数插入了一些新元素,最后通过循环遍历输出了插入后的所有数据。

由于使用了提示位置来提高插入新元素的效率和性能,所以这个例子中的代码可以更快地执行。

总结

unordered_multimap::emplace_hint()是一种非常有用的STL容器函数,能够有效提高插入新键值对的效率和性能。在处理较大的数据时应该考虑使用这个函数。