如何迭代向量并知道元素的索引?

unj*_*nj2 26 c++ iteration algorithm stl vector

我需要访问向量中的每个元素,并且还知道元素所在的索引.

到目前为止,我可以提出两种方法

 for (iterator it= aVector.begin(), int index= 0; it!= aVector.end(); ++it, ++index)
Run Code Online (Sandbox Code Playgroud)

留下类型签名.它看起来我不能使用汽车

 for (int index = 0; index < aVector.size(); ++index)
{
    // access using []
}
Run Code Online (Sandbox Code Playgroud)

哪一个更有效率还是有更好的方法来做到这一点?

Mik*_*our 16

对于矢量或其他随机访问容器,它几乎没有区别.我可能会选择第二个因为它更容易阅读,并且可能稍微快一点,因为只有一个循环变量需要更新.另一种选择是:

for (auto it = aVector.begin(); it != aVector.end(); ++it) {
    int index = std::distance(aVector.begin(), it);
}
Run Code Online (Sandbox Code Playgroud)

对于非随机访问容器,[]不可用,std::distance效率低; 在这种情况下,如果你需要索引,第一种方法会更好(虽然你需要修复它,所以它不会尝试在for-initialiser中声明两个不同类型的变量).

  • 这应该被修复以反映`std::distance` 返回`std::iterator_traits&lt;InputIt&gt;::difference_type` 的事实,这将是比`int` 更宽的类型。(事实上​​,很少有人会拥有足够大的容器来溢出一个 `int` 并不是一个借口。)使用 `auto` 的另一个原因 - 你为 `it` 而不是为 `index` 所做的很奇怪。 (2认同)

YSc*_*arf 11

其他方式。

int count = 0;
for (auto& it : aVector) {
   count++;
}
Run Code Online (Sandbox Code Playgroud)

  • 我先是想:当然,八个答案,已经有人提到了,毕竟这是最简单直接的做法。没有。给你+1。 (2认同)

Luc*_*ore 7

答案就是问题 - "知道元素所处的索引." .

所以 -

for (int index = 0; index < aVector.size(); ++index)
{
    // access using []
}
Run Code Online (Sandbox Code Playgroud)

性能方面他们是相同的(但你可以随时描绘自己).

  • @Rémi迂腐地说,它应该是vector <T> :: size_type :) (6认同)
  • index应该是`size_t`而不是`int` (4认同)
  • 是的。在大多数现代编译器中,int 是 32 位,size_t 是 64 位。所以如果你有一个非常大的向量,使用 int 将不起作用。 (3认同)