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代码行为的保证的问题,如果有的话.
std::vector返回随机访问迭代器,所以是的,这是安全的vector.
std::list返回双向迭代器.它们可以递增(++)和递减(--),但不允许任意算术(+,-)或相对比较(>,<).这不安全list.
您可以使用std::advance双向迭代器来提前或后退任意数量.在C++ 11中,您可以使用std::prev它代替iter - 1.
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |