C++ std::array 迭代器保证是类似指针的吗?

问题描述 投票:0回答:1

我有一个 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
元素的指针兼容?

c++ arrays pointers iterator
1个回答
0
投票

不,

std::array::iterator
保证是原始的
T*
指针。没有什么可以阻止实现使用代理类型来提供调试、边界检查等,就像任何其他容器类型一样。

此外,

arr[arr.size()]
超出范围,因此
&arr[arr.size()]
未定义行为。但
arr.begin()+arr.size()
是安全的。

© www.soinside.com 2019 - 2024. All rights reserved.