MBe*_*ett 5 c++ iterator loops
假设我有一个vector<int> myvec,我想反过来遍历所有元素.我可以想到几种方法:
for (vector<int>::iterator it = myvec.end() - 1; it >= myvec.begin(); --it)
{
// do stuff here
}
for (vector<int>::reverse_iterator rit = myvec.rbegin(); rit != myvec.rend(); ++rit)
{
// do stuff here
}
for (int i = myvec.size() - 1; i >= 0; --i)
{
// do stuff here
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是我什么时候应该使用它们?有区别吗?我知道第一个是危险的,因为如果我传入一个空的向量,那么myvec.end() - 1是未定义的,但是这有什么其他的危险或效率低下吗?
GMa*_*ckG 11
该reverse_iterator版本显示intent并适用于所有容器,无论其内容如何.
第一个是您描述的缺陷.它也使用>=,它不适用于非随机访问迭代器.
第三个问题i是int.它无法保持尽可能多的size()回报.使它成为unsigned works(vector<int>::size_type),但是我们遇到与解决方案一样的问题.(0U - 1- > Funky terminating checks- > :|)
一般都不是以上.相反,你通常应该高枕无忧几秒钟,弄清楚你想要应用哪种算法,而忘记自己编写一个循环.你可能会使用reverse_iterator它,但是根据你想要完成的事情,情况并非总是如此(例如,见std::copy_backwards).