如何将C风格数组作为值插入到std::unordered_map中

问题描述 投票:0回答:1

有没有办法将 C 风格数组作为值插入到

std::unordered_map
中?

例如以下都给出编译错误

#include <unordered_map>

int main() {
    std::unordered_map <int, int[2]> testMap;
    int temp[2]{ 0,0 };
    //testMap.insert({ 1, temp });
    //testMap[1] = temp;
    //testMap.insert({1,{0,0}});
    //testMap[1]=int[2]{0,0};
}

还是只能用地图来

std::unordered_map <int, int*>

我知道

std::array<int,2>
会起作用。但我是 C++ 新手,希望更好地理解 C 风格数组的行为。

c++
1个回答
0
投票

通常,数组类型对于标准容器来说不是有效类型,因为标准容器要求其

value_type
可破坏。这意味着您可以显式调用
obj.~T();
,例如在析构函数中清除容器。数组不支持此功能,您必须单独销毁元素(
for (auto& el : obj) el.~std::remove_extent_t<T>();
std::destroy_at(std::addressof(obj));
)。

但是,对于

std::unordered_map
value_type
std::pair<const key_type, mapped_type>
。这种类型可破坏的,只是很难构造。

你不能像

std::pair<const int, int[2]>{ 1, temp }
那样创建它,因为一个数组(通常)不能从另一个数组构造。

你必须做这样的事情:

std::pair<const int, int[2]> insertion(std::piecewise_construct, std::tuple<int>(1), std::tuple<>());
// pair initialises members like `: first(1), second()`, so second is empty
insertion.second[0] = temp[0]; insertion.second[1] = temp[1];
testMap.insert(insertion);

或者在 C++20 中,您可以使用括号来初始化像数组一样的聚合:

// pair initialises members like `: first(1), second(temp[0], temp[1])`
testMap.insert({ std::piecewise_construct, std::tuple(1), std::tuple(temp[0], temp[1]) });

复制/移动

value_type
即可达到您的预期。
std::pair
的复制构造函数是默认的,对于数组成员仅复制每个元素。唯一真正的问题是首先构建它。

© www.soinside.com 2019 - 2024. All rights reserved.