反向迭代向量

新手上路,请多包涵

我需要从头到尾遍历一个向量。 “正确”的方法是

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 许可协议

阅读 485
2 个回答

正如您所指出的,当条件为 i >= 0 时,其无符号的问题在于条件始终为真。不是在初始化 i 时减去 1,然后在每次迭代后再次减去 1,而是在检查循环条件后减去 1:

 for (unsigned i = v.size(); i-- > 0; )

我喜欢这种风格有几个原因:

  • 虽然 i 将在循环结束时环绕到 UINT_MAX ,但它不 依赖 于该行为 - 如果类型已签名,它的工作方式相同。依赖未签名的环绕对我来说有点像黑客。
  • 它只调用 size() 一次。
  • 它不使用 >= 。每当我在 for 循环中看到该运算符时,我必须重新阅读它以确保没有一个错误。
  • 如果更改条件中的间距,则可以使用 “goes to”操作符

原文由 Rob Kennedy 发布,翻译遵循 CC BY-SA 2.5 许可协议

在 C++20 中可以使用范围( #include <ranges>

 //DATA
std::vector<int> vecOfInts = { 2,4,6,8 };

//REVERSE VECTOR (
for (int i : vecOfInts | std::views::reverse)
{
     std::cout << i << "  ";
}

或者如果需要保存在不同的变量中。

 //SAVE IN ANOTHER VARIABLE
auto reverseVecOfInts = std::views::reverse(vecOfInts);

//ITERATION
for (int i : reverseVecOfInts)
{
    std::cout << i << "  ";
}

原文由 Pavan Chandaka 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏