C++中std::array迭代器是否保证与元素指针兼容?
std::array迭代器与指针的兼容性问题
假设我们定义了如下std::array:
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::reverse(arr.begin() + 5, arr.end());这是最稳妥的写法,
arr.begin()+5和arr.end()都是std::array的随机访问迭代器,属于同一序列,完全满足C++标准对std::reverse的参数要求。基于指针的合规写法
std::reverse(&arr[5], &arr[arr.size()]);这种写法也符合标准:
&arr[5]指向数组第6个元素,&arr[arr.size()]是数组的尾后指针(标准允许获取尾后指针,只要不访问该地址的内容)。两个指针属于同一连续序列的随机访问迭代器,满足std::reverse的参数要求。混合指针与迭代器的写法:标准不保证合规
std::reverse(&arr[5], arr.end());虽然在多数编译器中能正常运行,但C++标准并未保证该写法合法:
- 标准仅要求
std::array<T,N>::iterator是随机访问迭代器,但没有强制规定其底层类型必须是T*,也未要求它能与T*类型的指针相互转换或比较。 - 这种写法依赖编译器将
std::array迭代器实现为指针的细节,不具备跨平台移植性。
- 标准仅要求
替代的标准合规指针写法
如果偏好指针风格,推荐使用std::array的data()成员函数,它返回指向数组第一个元素的T*指针,写法合规且更清晰:
std::reverse(arr.data() + 5, arr.data() + arr.size());
内容的提问来源于stack exchange,提问作者Silvio Mayolo
相关产品推荐
相关产品推荐

