我之前asked about pointer subtraction,担心我的数组可能超过PTRDIFF_MAX
个元素,允许数组中的指针减法可能溢出。一致认为,标准中没有任何内容可以阻止此类阵列,但大多数(如果不是全部)实现都可能会禁止这些阵列。
现在我很想好相反的方向,特别是vector
s。我猜测我可以将任何size_t
添加到一个指针,前提是我保持在其数组内(或者在其结尾之后的一个元素) - 至少,我发现没有任何建议。对于vector::iterator
来说,事情似乎更复杂(这是不幸的,因为他们基本上打算成为更好的指针版本)。我可以使用任何vector
索引到vector::size_type
,但是vector::iterator
算术运算符需要vector::difference_type
,这可能会导致与上述相同的问题。这特别麻烦,因为某些vector
函数需要 vector::iterator
。
我考虑过advance(it, N)
尝试解决这个问题。不幸的是,这个函数模板的规范似乎内部不一致。我的理解是,对于非负N
,这应该等同于
while(N) {
++it;
--N;
}
但对于随机访问迭代器,它应该实现为:
it += N;
唉,如果N > numeric_limits<vector::difference_type>::max()
,这些不等同,因为在这种情况下,前者会产生定义明确的vector::iterator
(假设我们保持在vector
内})而后者可能(?)产生未定义的行为。
我误解了标准吗?是否有内置的方法来有效和安全地执行vector::iterator
s?