我需要从头到尾迭代一个向量。“正确”的方法是
for(std::vector<SomeT>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit)
{
//do Something
}当//do Something涉及到了解实际索引时,需要使用rit进行一些计算才能获得它,比如index = v.size() - 1 - (rit - v.rbegin)
如果无论如何都需要索引,那么我强烈认为最好使用该索引进行迭代。
for(int i = v.size() - 1; i >= 0; --i)
{
//do something with v[i] and i;
}这给出了一个警告,即i已签名,v.size()未签名。变到
for(unsigned i = v.size() - 1; i >= 0; --i)在功能上是错误的,因为这实际上是一个没完没了的循环:)。
做我想做的事的美感好方法是什么?
发布于 2010-11-17 16:40:52
正如您已经注意到的,在没有签名的情况下,i >= 0条件的问题是条件始终为真。与其在初始化i时减去1,然后在每次迭代之后再减去1,不如在检查循环条件后减去1:
for (unsigned i = v.size(); i-- > 0; )我喜欢这种风格有几个原因:
i将在循环结束时转到UINT_MAX,但它不依赖于这种行为--如果对类型进行了签名,它的工作方式也会相同。对我来说,依靠未签名的环绕感觉有点像一种黑客。size()。>=。每当我在for循环中看到那个操作符时,我都必须重新读取它,以确保不会出现任意一个错误。发布于 2010-11-17 15:43:19
没有什么可以阻止您的reverse_iterator循环,也可以使用其他多个答案中描述的索引。这样,您就可以根据需要在// do the work部件中使用迭代器或索引,而额外的成本也是最低的。
size_t index = v.size() - 1;
for(std::vector<SomeT>::reverse_iterator rit = v.rbegin();
rit != v.rend(); ++rit, --index)
{
// do the work
}不过我很想知道你需要这个索引做什么。访问v[index]与访问*rit是一样的。
发布于 2010-11-17 15:25:56
美得令人愉悦!)
for(unsigned i = v.size() - 1; v.size() > i; --i)https://stackoverflow.com/questions/4205720
复制相似问题