【发布时间】:2017-05-20 16:16:31
【问题描述】:
假设我有一个包含 100 个值的 std::deque<int> d,从 0 到 99。给定the following:
与向量不同,双端队列不能保证将所有元素存储在 连续的存储位置:访问双端队列中的元素 将指针偏移到另一个元素会导致未定义的行为。
下面的行似乎无效:
int invalidResult = *(d.begin() + 81); // might give me 81, but NOT GUARANTEED, right?
我的问题是:迭代器会处理这个问题吗?
std::deque<int>::iterator it = d.begin();
int isThisValid = *(it + 81); // 81 every time? or does it result in undefined behavior?
在某一时刻,我曾认为迭代器会处理底层存储中的任何不连续性,但现在我不太确定。显然,如果你使用it++ 81 次,*it 将给你81 结果。
有人可以肯定地说吗?
不管怎样,我没有使用 C++11。
【问题讨论】:
-
“通过偏移一个指针”的哪一部分与
d.begin() + 81有关系? -
你问的是双端队列迭代器是否是随机访问的?是的。是的。
-
@KerrekSB 所以他们想说“不要取一个元素的地址然后从那里偏移”?
-
@kmort 是的,这正是他们想说的。与向量不同,双端队列的存储不是连续的。
-
@kmort:是的,这就是“指针”通常的意思。