3

当我有简单的指针时,我可以像这样安全地包装数组:

p+=X;   // p pointer p can point beyond end of array
if(p>=array+array_size) p-=array_size;    // forget about potential multiple wrap

我可以在任何可索引容器上安全地为迭代器做同样的事情吗?双端队列?:

p+=x;
if(p>=mydeque.end()) p-=mydeque.size(); // forget about potential multiple wrap

换句话说:将迭代器指向集合之外的计算是否安全?

4

3 回答 3

4

p += X;只要它仍然指向数组/容器内或数组/容器末尾(第 5.7 节),您就可以这样做:

如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则计算不应产生溢出;否则,行为未定义。

指针之间的比较也是如此。它们必须都指向同一个数组或最后一个数组。他们不能比这更进一步。

于 2013-05-15T14:24:16.173 回答
2

(我假设您正在谈论随机访问迭代器,因为对于大多数双向非随机访问迭代器来说,这甚至可能无法编译。)

不,这对于一般迭代器来说是不安全的。事实上,它甚至不安全的指针。根据标准,指针只能安全地指向数组内或数组的最后一个元素,并且指向不同数组的指针之间不可移植地进行比较。(在现代硬件上,一般的指针比较通常有效,但这并不能保证。如果你想要可移植性,你需要使用std::less<>.)

于 2013-05-15T14:25:21.923 回答
0

递增并且end() iteratorUB,这意味着p+=x;如果超出end().

为什么不做这样的事情

size_t dis = std::distance(std::begin(mydeque),p);
std::advance(p, (dis + X) % mydeque.size());
于 2013-05-15T14:28:58.337 回答