end()迭代器上的指针算术

jim*_*iki 6 c++ iterator stl

让A成为a std::vector<double>,

这个定义明确吗?

if(!A.empty())
    std::vector<double>::iterator myBack = A.end() - 1;
Run Code Online (Sandbox Code Playgroud)

end迭代器是否仅适用于均等和不等式检查?或者只要我留在容器中,我就可以执行一些指针运算?

在我的平台上,此代码有效.我想知道这是否便携.

Bat*_*eba 5

如果您注意一些特殊情况,这几乎是安全的:

A.end()为您提供一个迭代器,表示刚好超出std::vector. 你应该尝试取消对它的引用。

如果载体具有零个元素然后A.end() - 1明确定义。在所有其他情况下,只要您在容器边界内,您确实可以执行指针运算。请注意,该标准保证std::vector数据是连续的,并且以与 contains 类型的 C++ 数组完全相同的方式打包。唯一的例外是std::vector<bool>由于标准指定的紧密包装专业化而表现不同。(即注井sizeof(bool)保证有由标准的特定值)。

如果我是你,我会A.rbegin()在继续之前访问最右边的元素并检查返回值并坚持迭代器公式。忘记std::vector<bool>专业化太容易了。


Cem*_*zer 5

它是一个完全有效vector::iterator的随机访问迭代器.您可以对它执行算术运算,它不依赖于平台.

std::vector<double>::iterator it = A.end();
while (it != A.begin()){
    --it; //this will skip A.end() and loop will break after processing A.front()
    //do something with 'it'
}
Run Code Online (Sandbox Code Playgroud)

但是A.end()指的是理论上的过去元素,因此它不指向一个元素,因此不应被解除引用.因此,最佳实践是使用反向迭代器而不是递减结束迭代器.

for(std::vector<double>::reverse_iterator it = A.rbegin(); it != A.rend(); ++it) {
    //do something with 'it'
}
Run Code Online (Sandbox Code Playgroud)

这两个循环做同样的事情,第二个是可以理解的,更清洁的方式.