在以下代码中,vector<int>
由int8_t
数组构成。它碰巧工作,但它安全吗?
int8_t *arr;
int arr_size;
... // Filling the array somehow
std::vector<int> v(arr, arr + arr_size); // Is this safe even though we use int8_t* to construct a vector of int?
cppreference.com处的文档说:
如果
vector(static_cast<size_type>(first), static_cast<value_type>(last), a)
是整数类型,则此构造函数与InputIt
具有相同的效果。 (直到C ++ 11)如果
InputIt
满足InputIterator
,则此重载仅参与重载解析,以避免与重载(2)的歧义。 (自C ++ 11起)
这个解释并没有给我一个关于我的问题的线索。事实上,它让我更加困惑,因为静态强制转换的模板参数似乎非常错误......
答案 0 :(得分:3)
是的,这很安全。所有标准容器都可以从任何迭代器对构造,迭代器值类型可以(隐式)转换为容器值类型。这同样适用于insert
或assign
等功能。
答案 1 :(得分:1)
您正在使用的向量构造函数实现类似于copy algorithm。
template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last,
OutputIt d_first)
{
while (first != last) {
*d_first++ = *first++;
}
return d_first;
}
如果两种类型的大小相同,编译器可能会进一步优化并使用memcpy()
。然而,这种优化发生在较低的层次,这可能是你认为它可能失败的原因。
所需的两件事是输入和输出容器的长度需要匹配(在你的情况下自动完成)和*d_first++ = *first++;
需要编译。因此,如果您的类型不同,则可能需要声明赋值运算符。