gpt4 book ai didi

c++ - 如何将映射值直接放入 unordered_map 中?

转载 作者:行者123 更新时间:2023-12-04 07:14:51 25 4
gpt4 key购买 nike

我是否正确理解 std::unordered_map 的::insert 函数采用 std::pair<'key', 'mapped_value'> 并且 emplace 只需:

first_arg is the key

second_arg is the mapped element
所以:
#include <unordered_map>

struct SomeStruct
{
SomeStruct(int, double, char) {};
};
int main()
{
std::unordered_map<int, SomeStruct> mymap2;
mymap2.emplace(6, SomeStruct{ 5, 0.0, 'c' });
}
这意味着没有像构建我的映射值(结构)这样的东西,是吗?如果这些是 'emplace' 需要的参数,那么为什么它首先有可变参数?使用可变参数,第一个参数可能是键,其余参数可能是类类型的构造函数参数,以便在适当位置构造,完美转发,这会更有效率,如果我是对的,那么在这种情况下emplace 与 'insert' 没有什么不同,后者可以进行复制或移动。然而,在上面的例子中,'emplace' 看起来是在进行复制或移动构造。
我是否正确理解了这些论点?如果我是对的,那么奇怪的是会有可变参数模板参数。
编辑:我在我的程序上面检查了 SomeStruct 的构造函数在创建临时和移动构造函数时被调用,我假设将它移动到存储桶中。有什么方法可以在 std::vector::emplace 中构建它吗?

最佳答案

emplace是可变参数来处理 constructor 的所有重载由 std::pair 提供.特别是std::pair有一个分段构造函数。它需要一个 std::piecewise_construct_t作为第一个参数。它允许将参数作为元组转发给映射值的构造函数。
来自 cppreference 的示例:

#include <iostream>
#include <utility>
#include <string>
#include <unordered_map>

int main()
{
std::unordered_map<std::string, std::string> m;

// [...]

// uses pair's template constructor
m.emplace("d", "ddd");

// uses pair's piecewise constructor
m.emplace(std::piecewise_construct,
std::forward_as_tuple("c"),
std::forward_as_tuple(10, 'c'));
// as of C++17, m.try_emplace("c", 10, 'c'); can be used

for (const auto &p : m) {
std::cout << p.first << " => " << p.second << '\n';
}
}

关于c++ - 如何将映射值直接放入 unordered_map 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68828864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com