首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逆向迭代向量

逆向迭代向量
EN

Stack Overflow用户
提问于 2010-11-17 15:06:14
回答 10查看 34.9K关注 0票数 41

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

代码语言:javascript
复制
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)

如果无论如何都需要索引,那么我强烈认为最好使用该索引进行迭代。

代码语言:javascript
复制
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)在功能上是错误的,因为这实际上是一个没完没了的循环:)

做我想做的事的美感好方法是什么?

  • 是无警告的
  • 不涉及模组
  • 不是太冗长
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-11-17 16:40:52

正如您已经注意到的,在没有签名的情况下,i >= 0条件的问题是条件始终为真。与其在初始化i时减去1,然后在每次迭代之后再减去1,不如在检查循环条件后减去1:

代码语言:javascript
复制
for (unsigned i = v.size(); i-- > 0; )

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

  • 尽管i将在循环结束时转到UINT_MAX,但它不依赖于这种行为--如果对类型进行了签名,它的工作方式也会相同。对我来说,依靠未签名的环绕感觉有点像一种黑客。
  • 它只调用一次size()
  • 它不使用>=。每当我在for循环中看到那个操作符时,我都必须重新读取它,以确保不会出现任意一个错误。
  • 如果更改条件中的间距,则可以使其使用“转到”操作员
票数 64
EN

Stack Overflow用户

发布于 2010-11-17 15:43:19

没有什么可以阻止您的reverse_iterator循环,也可以使用其他多个答案中描述的索引。这样,您就可以根据需要在// do the work部件中使用迭代器或索引,而额外的成本也是最低的。

代码语言:javascript
复制
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是一样的。

票数 16
EN

Stack Overflow用户

发布于 2010-11-17 15:25:56

美得令人愉悦!)

代码语言:javascript
复制
for(unsigned i = v.size() - 1; v.size() > i; --i)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4205720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档