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

C++ 在C+中安全吗+;是否要从container.end()中减去?,c++,stl,iterator,language-lawyer,C++,Stl,Iterator,Language Lawyer,也就是说,如果容器不是空的,我可以安全地执行以下操作: std::vector<int> container; container.push_back( 0xFACE8D ); auto last = container.end() - 1; 对于任意的非空容器又如何 编辑:让我澄清这个问题 有时,完全合法的代码行为不正确。问题是:假设上述代码已编译,那么这样做安全吗 对于普通的C样式数组应该是安全的,因为相应的迭代器只是指针。但是对于更复杂的容器来说安全吗 假设有人使用如下迭代器

也就是说,如果
容器
不是空的,我可以安全地执行以下操作:

std::vector<int> container;
container.push_back( 0xFACE8D );
auto last = container.end() - 1;
对于任意的非空容器又如何

编辑:让我澄清这个问题

有时,完全合法的代码行为不正确。问题是:假设上述代码已编译,那么这样做安全吗

对于普通的C样式数组应该是安全的,因为相应的迭代器只是指针。但是对于更复杂的容器来说安全吗

假设有人使用如下迭代器实现列表:

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

class MyList {
    MyListIterator *end() { return NULL; }
    ...
}; 
然后,尽管在语法上完全合法,但尝试递减
container::end()
,将导致segfault


不过,我希望
stl
容器比这聪明得多。因此,关于上述
stl::list
代码行为(如果有)的保证问题将返回。

std::vector
,因此是的,这对于
vector
是安全的


std::list
返回。它们可以递增(
++
)和递减(
--
),但不允许进行任意算术(
++
-
)或相对比较(<代码> >代码> <代码> < P> C++标准称 STD::vector:迭代器< /C>是指向过去元素的随机访问迭代器。因此您可以安全使用<代码> ->代码>和<代码> +>代码>操作符。< /P>
std::vector
不同,
std::list::iterator
是一种双向迭代器,只支持
--
++
运算符。

如果它能编译,就意味着有人在实现
运算符时遇到了麻烦()
,这强烈表明他们打算让你称之为…@crayzeewulf:我不是在提倡这种用法,只是好奇它是否安全,在代码中看到了类似的东西。@Kevin“它会编译,所以一定没问题”在C++中是一个很差的试探法。@米迦勒得到了。在第二种情况下,我看到了 STD::列表
后,我意识到了。如果编译器接受了STD::列表,我会感到非常惊讶。很好的捕捉。我的问题有点不同,但是会在一秒钟内添加解释。
class MyListIterator {
    MyListIterator *prev, *next;
    MyListIterator * operator--() { return prev; }
    ...
};

class MyList {
    MyListIterator *end() { return NULL; }
    ...
};