C++ 将指针而不是迭代器传递到std::copy

C++ 将指针而不是迭代器传递到std::copy,c++,pointers,iterator,copy,indexoutofboundsexception,C++,Pointers,Iterator,Copy,Indexoutofboundsexception,在执行代码审阅时发现此代码: std::array<uint, 10> expArray2 = {92,130,169,951,634,187,377,233,865,944}; copy(&expArray2[0], &expArray2[10], back_inserter(expected)); ^~~~Is this Undefined behavior as ArrayIndexOutOfBoundAccess

在执行代码审阅时发现此代码:

std::array<uint, 10> expArray2 = {92,130,169,951,634,187,377,233,865,944};
copy(&expArray2[0], &expArray2[10], back_inserter(expected));
                        ^~~~Is this Undefined behavior as ArrayIndexOutOfBoundAccess?
我的同事说1。)两者都是相同的2。)没有未定义的行为

我向他解释了指针和迭代器以及签名是两件事:

template <class InputIterator, class OutputIterator>
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result); 
模板
输出迭代器副本(输入迭代器第一,输入迭代器最后,输出迭代器结果);

如果我有什么地方错了,请有人向我确认/解释一下好吗?

你的同事是对的

迭代器是一个概念,具有指向fullfil的需求(它们可以被取消引用,并且增量是最小值)

也可以,C++中的范围是半开的,这意味着传递给算法的第二个(最后一个)迭代器需要<>强>过去的。它从未被撤销(这是由C++标准保证的),所以没有UB代码。 注意:

expected.begin()
back\u插入器(expected)
不同。对于前者,您需要一个足够大的容器来容纳结果范围,而后者会自动扩展它。

使用std::copy和std::array是完全有效的。基本上,std::copy与表示输入范围的指针一起工作,因为指针满足输入迭代器的所有要求

至于将输入范围的begin-end-end-end取为&expArray2[0]和&expArray2[10],也可以,因为std::array保证管理一个连续的底层数组,所以您可以像处理任何常见的C样式数组一样处理该数组

至于我,我更喜欢在std::copy中使用std::begin和std::end:


指针是一种迭代器。你提供的链接中甚至提到了这一点。是的,但我主要关心的是arrayIndexOutOfBoundAccess。这个问题的核心似乎是关于表达式
&expArray2[10]
。在这种情况下,这看起来是相关的:是的,您理解正确。您可能希望对
back\u inserter(预期)
vs.
expected.begin()
@user2899162的使用进行评论。你说得对,这有点可疑。我知道这个区别,向量以前没有提供大小。所以没关系。
template <class InputIterator, class OutputIterator>
  OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result); 
std::copy(std::cbegin(expArray2), std::cend(expArray2),
    std::back_inserter(expected));