将std:set <int32_t>复制到std :: set <uint32_t>的好方法

时间:2018-09-17 19:25:26

标签: c++ stl

在uint32_t和int32_t之间存在隐式转换。我惊讶地发现我不能说:

void somefunc(std::set<uint32_t> arg);

std::set<int32_t> ary1;
somefunc(ary1);

这是为什么?是否有一种简短而甜美的语法而无需编写for循环即可将第一个int32_t数组复制到临时uint32_t数组中?

谢谢。

1 个答案:

答案 0 :(得分:6)

通常可以使用其他容器的范围(由成对的迭代器指定)来构造标准容器。考虑以下示例:

#include <cstdint>
#include <set>

void foo(std::set<uint32_t> arg) {}

int main()
{
    std::set<int32_t> x;
    foo({ x.begin(), x.end() });
}

foo期望为std::set<uint32_t>,但是xstd::set<int32_t>{x.begin(), x.begin()}正在创建一个新的临时std::set<uint32_t>,该临时副本将从x复制所有值。您可能会在较早的代码中找到std::set<uint32_t>(x.begin(), x.end())。只要所包含的元素兼容,这在不同种类的容器之间也适用。