【问题标题】:Is there an efficient way to use a for loop iterator while still having access to the element number? [duplicate]有没有一种有效的方法来使用 for 循环迭代器,同时仍然可以访问元素编号? [复制]
【发布时间】:2021-12-08 10:28:24
【问题描述】:

这可能是一个很容易回答的问题,但我一直在尝试改变我的语法,以便更有效地使用带有向量的 for 循环。我之前使用的是普通的循环方法:

for (int i = 0; i < vector.size(); i++){
     //code 
}

但我正在尝试改变我推荐使用迭代器的方法

for (const auto i : vector){
     //code 
}

我喜欢这种方式,因为它看起来更干净,并且显然是大多数人推荐的方式,但是以前的方法允许我使用“i”,以便我可以控制特定的元素编号。因此,如果我想访问第 5 个元素,我可以通过在循环的第 5 次迭代中放置“vector[i]”来做到这一点。我确信第二种方法也允许这样做,我只是不知道要使用的具体代码。有人可以推荐他们认为使用第二种方法获取元素访问权限的最佳方法吗?

【问题讨论】:

  • 您可以使用for (auto&amp; element : vector){,然后element 将是对向量中元素的引用(而不是副本),您可以根据需要进行更改。
  • 基于范围的循环的主要优点之一是索引无关紧要。如果索引对您很重要,那么使用基于索引的循环通常会更简单。
  • stackoverflow.com/questions/1315041/… 中的任何答案对您有帮助吗?
  • 这个怎么样? for (int&amp; i : list) { std::cout &lt;&lt; "index = " &lt;&lt; (&amp;i - list.data()); }
  • @upkajdt 我发现这令人不安,您对容器的内存布局做出了假设。我不会在地图或场景中尝试这个。

标签: c++ for-loop vector iterator


【解决方案1】:

在 for 循环之前创建一个变量,并在每次迭代时递增它。 然后就可以作为索引使用了。

如果你不想用一个新的无用变量污染外部范围,你可以把它全部放在额外的括号中。

{
   int index = 0;

   for (const auto i : vector){
   //code 
   index++;
   }
}

【讨论】:

  • 您的 code 将第一个元素视为索引 1,而不是 0,因此您需要 1) 将 index 初始化为 -1 而不是 0,或 2) 递增indexcode 之后而不是在它之前。
  • 无论如何,自 C++20 起,index 可以在循环本身中声明,因此不会污染外部范围:for (int index = 0; const auto i : vector){ ... ++index; }
  • @RemyLebeau 这似乎是最好的解决方案,您会将其作为单独的答案发布,还是我应该自己编辑?
  • 你能把它作为一个单独的答案发布” - 不需要,因为它已经在链接的副本中描述了。 “或者,我应该自己编辑吗?”——这取决于你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 2020-06-30
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 2021-05-28
  • 2010-10-03
相关资源
最近更新 更多