从由较小类型的指针定义的范围构造向量

时间:2018-03-03 21:00:30

标签: c++ c++11 stdvector

在以下代码中,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起)

这个解释并没有给我一个关于我的问题的线索。事实上,它让我更加困惑,因为静态强制转换的模板参数似乎非常错误......

2 个答案:

答案 0 :(得分:3)

是的,这很安全。所有标准容器都可以从任何迭代器对构造,迭代器值类型可以(隐式)转换为容器值类型。这同样适用于insertassign等功能。

答案 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++;需要编译。因此,如果您的类型不同,则可能需要声明赋值运算符。