C ++ deque迭代器有多聪明

时间:2017-01-05 23:34:49

标签: c++ stl deque

我说std::deque<int> d包含100个值,从099。鉴于the following

  

与矢量不同,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。

2 个答案:

答案 0 :(得分:8)

  

下面显示的行无效:

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

答案 1 :(得分:1)

根据this reference herestd::deque提供RandomAccessIterator,根据您的示例肯定会有效。

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