我说std::deque<int> d
包含100个值,从0
到99
。鉴于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。
答案 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 here,std::deque提供RandomAccessIterator,根据您的示例肯定会有效。
std::deque<int>::iterator it = d.begin();
int isThisValid = *(it + 81); // will be fine assuming the deque is that large