我需要从头到尾遍历一个向量。 “正确”的方法是
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)
只是功能错误,因为这本质上是一个无限循环 :)
什么是做我想做的事的美学上的好方法
- 没有警告
- 不涉及演员表
- 并不过分冗长
原文由 Armen Tsirunyan 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如您所指出的,当条件为
i >= 0
时,其无符号的问题在于条件始终为真。不是在初始化i
时减去 1,然后在每次迭代后再次减去 1,而是在检查循环条件后减去 1:我喜欢这种风格有几个原因:
i
将在循环结束时环绕到UINT_MAX
,但它不 依赖 于该行为 - 如果类型已签名,它的工作方式相同。依赖未签名的环绕对我来说有点像黑客。size()
一次。>=
。每当我在for
循环中看到该运算符时,我必须重新阅读它以确保没有一个错误。