我有一个 C++ 数组。
std::array<int, 10> arr { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
我想反转最后五个元素,最终得到
{ 0, 1, 2, 3, 4, 9, 8, 7, 6, 5 }
。我知道 std::array
为我提供了随机访问迭代器,所以我绝对可以编写。
std::reverse(arr.begin() + 5, arr.end());
但我想知道其他一些可能的方法。
T*
是一个随机访问迭代器,所以我可以写
std::reverse(&arr[5], &arr[arr.size()]);
我的相当肯定是明确定义的,因为允许引用(但不能访问)数组的末尾一位。我想知道这是否被允许。
std::reverse(&arr[5], arr.end());
这在我的机器上运行,但这并不意味着它是标准行为。如果
arr
是一个 C 风格数组 T[]
,那么它的迭代器类型显然是 T*
。但是,至少粗略地看,我没有看到任何保证 std::array<T, C>::iterator
等于 T*
或者甚至可以与之相媲美。标准是否保证上述代码行有效?是否保证 std::array<T, C>::iterator
与指向数组中 T
元素的指针兼容?
不,
std::array::iterator
不保证是原始的T*
指针。没有什么可以阻止实现使用代理类型来提供调试、边界检查等,就像任何其他容器类型一样。
此外,
arr[arr.size()]
超出范围,因此&arr[arr.size()]
是未定义行为。但arr.begin()+arr.size()
是安全的。