C++迭代器有多聪明

How smart is C++ deque iterator

本文关键字:迭代器 C++      更新时间:2023-10-16

假设我有一个包含 100 个值的std::deque<int> d,从 099 。鉴于以下情况:

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

下面一行似乎无效:

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。

下面一行似乎无效:

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

相反。该语句是完全有效的,并且行为是有保证的(假设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?

这几乎等同于前面的代码,只是您使用了命名变量,而不是临时迭代器。行为完全相同。

<小时 />

以下是您不能执行的操作的示例:

int* pointer = &d.front();
pointer[offset] = 42; // oops

根据这里的参考,std::d eque 提供了一个 RandomAccessIterator,它肯定会根据您的示例工作。

std::deque<int>::iterator it = d.begin();
int isThisValid = *(it + 81); // will be fine assuming the deque is that large