在c++中从container.end()中进行减法是否安全?

Is it safe in C++ to subtract from container.end()?

本文关键字:是否 安全 中从 c++ container end      更新时间:2023-10-16

也就是说,如果container不是空的,我可以安全地这样做:

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

:

编辑:用--代替-1:

std::list<int> container;
container.insert( 0xFACE8D );
auto last = container.end();
--last;

和任意非空容器?

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

有时候完全合法的代码会出现错误。问题是:假设上面的代码可以编译,这样做安全吗?

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

假设使用如下迭代器实现list:

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

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

我希望,虽然,stl容器比这聪明得多。因此,关于上述stl::list代码行为的保证的问题,如果有的话。

std::vector返回随机访问迭代器,所以这对于vector来说是安全的。

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

可以在双向迭代器上使用std::advance来前进或后退任意数量。在c++ 11中,你可以使用std::prev来代替iter - 1

c++标准规定std::vector<T>::iterator是指向过尾元素的随机访问迭代器。因此,您可以安全地使用-+运算符。

std::vector不同,std::list<T>::iterator双向迭代器,只支持--++运算符。