C++ deque迭代器有多聪明

kmo*_*ort 2 c++ stl deque

说我有一个std::deque<int> d含有100个值,从099.鉴于以下内容:

与向量不同,deques不能保证将其所有元素存储在连续的存储位置中:通过将指针偏移到另一个元素来访问双端队列中的元素会导致未定义的行为.

它似乎在下面的行无效:

int invalidResult = *(d.begin() + 81); // might give me 81, but NOT GUARANTEED, right?
Run Code Online (Sandbox Code Playgroud)

我的问题是:迭代器会处理这个问题吗?

std::deque<int>::iterator it = d.begin();
int isThisValid = *(it + 81); // 81 every time? or does it result in undefined behavior?
Run Code Online (Sandbox Code Playgroud)

有一次,我曾经认为迭代器会处理底层存储中的任何不连续性,但现在我不太确定.显然,如果你使用it++81次,*it会给你81一个结果.

有人可以说肯定吗?

对于它的价值,我不是在使用C++ 11.

eer*_*ika 8

它似乎在下面的行无效:

int invalidResult = *(d.begin() + 81); // might give me 81, but NOT GUARANTEED, right?
Run Code Online (Sandbox Code Playgroud)

反之.该陈述完全有效,行为得到保证(假设d.size() >= 82).这是因为std::deque::begin返回迭代器而不是指针,因此引用的规则不适用.

std::deque<int>::iterator it = d.begin();
int isThisValid = *(it + 81); // 81 every time? or does it result in undefined behavior?
Run Code Online (Sandbox Code Playgroud)

这几乎与前面的代码等效,除了你使用了一个命名变量,而不是一个临时迭代器.行为完全一样.


以下是您可能不会做的一个示例:

int* pointer = &d.front();
pointer[offset] = 42; // oops
Run Code Online (Sandbox Code Playgroud)