在C++中从container.end()中减去是否安全?

Mic*_*ael 6 c++ iterator stl language-lawyer

也就是说,提供container不是空的,我可以安全地执行此操作:

std::vector<int> container;
container.push_back( 0xFACE8D );
auto last = container.end() - 1;
Run Code Online (Sandbox Code Playgroud)

还有这个:

编辑:替换-1--:

std::list<int> container;
container.insert( 0xFACE8D );
auto last = container.end();
--last;
Run Code Online (Sandbox Code Playgroud)

再次为任意非空容器?

编辑:让我澄清一下这个问题.

有时完全合法的代码行为不正确.问题是:假设上面的代码编译,这样做是否安全?

对于普通的C风格数组应该是安全的,因为相应的迭代器只是指针.但对于更复杂的容器是否安全?

假设一个实现带有这样的迭代器的列表:

class MyListIterator {
    MyListIterator *prev, *next;
    MyListIterator * operator--() { return prev; }
    ...
};

class MyList {
    MyListIterator *end() { return NULL; }
    ...
}; 
Run Code Online (Sandbox Code Playgroud)

然后尝试减少container::end(),尽管在语法上完全合法,将导致段错误.

不过,我希望stl容器比这更聪明.因此,关于上述stl::list代码行为的保证的问题,如果有的话.

Joh*_*ica 7

std::vector返回随机访问迭代器,所以是的,这是安全的vector.

std::list返回双向迭代器.它们可以递增(++)和递减(--),但不允许任意算术(+,-)或相对比较(>,<).这不安全list.

您可以使用std::advance双向迭代器来提前或后退任意数量.在C++ 11中,您可以使用std::prev它代替iter - 1.