有没有办法将 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 风格数组的行为。
通常,数组类型对于标准容器来说不是有效类型,因为标准容器要求其
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
的复制构造函数是默认的,对于数组成员仅复制每个元素。唯一真正的问题是首先构建它。