考虑以下一段代码
void foo( bool forwad )
{
vector<MyObject>::iterator it, end_it;
int dir;
it = some_global_vector.begin() + some_position;
if( forward )
{
dir = 1;
it += 1;
end_it = some_global_vector.end();
}
else
{
dir = -1;
it -= 1;
end_it = some_global_vector.begin()-1;
}
while( it != end_it )
{
if( do_domething() )
break;
it += dir;
}
}
正如您所看到的,当forward == false
有一个减法时存在一些疑问,begin()
并且迭代器it
可以在它指向时被减法begin()
。如果可以的话,我找不到任何地方,直到我不取消引用这个错误的指向迭代器)。
编辑
我阅读了 ISO C++ 标准并得出了一些结论。没有承诺vector::begin()
不能在内部指向 adress 的内存0
,我在想这已经结束了,但是所有容器都依赖于标准分配器。此分配器取决于new
运营商。而且,没有new
永远不会返回的信息0
。但是标准的分配器也依赖于delete
操作符,如果你通过了,这个操作符应该什么也不做0
。因此,根据这个事实,new
不能返回0
,因为将无法删除该指针,因此,非空vector
不能返回begin()
指向0
.
结论:
如果上面是正确的递减interator,指向的vector::begin()
应该是安全的,因为内部存储器vector
是连续的。
我对吗?
终极答案
即使它现在可以工作并且将来可以工作,根据标准,它也是未定义的行为。如果您这样做,您将自行承担风险。有关更多信息,请参阅此类似问题。