在C++中使用容器时,经常会对iterator赋值begin和end,如果当iterator=container.begin()时,再使用--iterator,这时iterator的值是什么代表什么意思,如果再使用++iterator,还会变成原来的值吗。
在mac os 10.10下使用clang3.5实测:
int main()
{
std::vector<int> a;
a.push_back(1);
a.push_back(2);
std::vector<int>::iterator iter = a.begin();
--iter;
std::cout<<*iter<<std::endl; // 输出0(这里的值并不确定,刚开始是一个很大的负数)
--iter;
std::cout<<*iter<<std::endl; // 输出0
++iter;
std::cout<<*iter<<std::endl; // 输出0
++iter;
std::cout<<*iter<<std::endl; // 输出1
iter = a.end();
++iter;
std::cout<<*iter<<std::endl; // 输出(输出一个很大的负数)
--iter;
--iter;
std::cout<<*iter<<std::endl // 输出2
return 0;
在clang下是可以做到越界后再返回的,并且返回后获得的值也是正确的,这是STL的标准的要求还是仅个别编译器自己的实现,并且vector是如何实现越界后能返回的。
STL标准中的说法是未定义,或者说是某某操作会让迭代器失效,并且不要使用未定义或者失效的迭代器。
但各家编译器的具体实现各不相同,我曾经做过vector和map的迭代器在红帽Linux、HPUX和IBM AIX上越界后的实验,最严重的反应是程序直接跑飞了……
为了程序更好的兼容性,听标准的话吧~
对
container.begin()
做减,和对container.end()
做加,都是 UB (未定义行为)。请参考类似问题:http://stackoverflow.com/questions/19417171/stl-iterator-before-stdmap...
PS: 建议不要去研究 UB, 没有什么意义。