gpt4 book ai didi

c++ - C++双端队列迭代器有多聪明

转载 作者:太空狗 更新时间:2023-10-29 23:43:47 26 4
gpt4 key购买 nike

假设我有一个 std::deque<int> d包含 100 个值,来自 099 .鉴于 the following :

Unlike vectors, deques are not guaranteed to store all its elements in contiguous storage locations: accessing elements in a deque by offsetting a pointer to another element causes undefined behavior.

下面的行似乎无效:

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结果。

有人可以肯定地说吗?

就其值(value)而言,我没有使用 C++11。

最佳答案

It appears line below is not valid:

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

关于c++ - C++双端队列迭代器有多聪明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41496585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com