设A为std::vector<double>
,end()迭代器上的指针运算
这是明确的吗?
if(!A.empty())
std::vector<double>::iterator myBack = A.end() - 1;
是在end
迭代器只对等式和不等式检查好?或者只要我留在容器中,我可以执行一些指针算术?
在我的平台上,此代码工作。我想知道这是否便携。
设A为std::vector<double>
,end()迭代器上的指针运算
这是明确的吗?
if(!A.empty())
std::vector<double>::iterator myBack = A.end() - 1;
是在end
迭代器只对等式和不等式检查好?或者只要我留在容器中,我可以执行一些指针算术?
在我的平台上,此代码工作。我想知道这是否便携。
这是完全有效的,因为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'
}
A.end()
但是指理论过去最端部元件,因此它不指向一个元素,因此不应被解除引用。所以最好的做法是使用反向迭代器,而不是递减结束迭代器。
for(std::vector<double>::reverse_iterator it = A.rbegin(); it != A.rend(); ++it) {
//do something with 'it'
}
这两个循环做同样的事情,第二就是可以理解的,更清洁的方式来做到这一点。
这几乎安全的,如果你留意的一些特殊情况:
A.end()
给你一个迭代器表示位置刚好超过std::vector
结束。您应该而不是试图取消引用它。
如果矢量具有零元素,则A.end() - 1
是而不是明确定义的。在所有其他情况下,只要您处于容器边界内,就可以确实执行指针运算。请注意,该标准保证std::vector
数据是连续的,并且与包含类型的C++数组完全相同。唯一的例外是std::vector<bool>
,由于标准规定的紧包装专业化,其行为不同。 (注意sizeof(bool)
是而不是保证有一个标准的特定值)。
如果我是你,我会使用A.rbegin()
访问最右边的元素并在继续之前检查返回值并坚持迭代器公式。忘记std::vector<bool>
专业化非常容易。
我不确定'bool'的情况。这个迭代器 - 不是指针 - 算术,就像@ Jarod42指出的那样?难道这不应该使它完全安全并且为'std :: vector
如果一个'std :: vector
如果'std :: vector
这很好,你也可以使用'A.rbegin()'。 – perreal 2014-09-19 07:28:36
它是* iterator *算术。它应该可以用于双向迭代器(如'std :: vector :: iterator')。 – Jarod42 2014-09-19 07:28:55