使用迭代器获取向量索引

and*_*ykx 5 c++ indexing iterator vector

迭代向量的元素时,最好使用迭代器而不是索引(请参阅为什么使用迭代器而不是数组索引?).

std::vector<T> vec;
std::vector<T>::iterator it;
for ( it = vec.begin(); it != vec.end(); ++it )
{
   // do work
}
Run Code Online (Sandbox Code Playgroud)

但是,可能需要在循环体中使用索引.考虑到性能和灵活性/可扩展性,在这种情况下,下列哪一项更可取?

  1. 恢复到索引循环
    std::vector vec;
    size_t i;
    for ( i = 0; i < vec.size(); ++i )
    {
       // use i
    }
    
  2. 计算偏移量
    std::vector vec;
    std::vector::iterator it;
    for ( it = vec.begin(); it != vec.end(); ++it )
    {
       size_t i = it - vec.begin(); 
       // use i
    }
    
  3. 使用std :: distance
    std::vector vec;
    std::vector::iterator it;
    for ( it = vec.begin(); it != vec.end(); ++it )
    {
       size_t i = std::distance( vec.begin(), it );
       // use i
    }
    

Luc*_*lle 13

如果您计划仅使用向量,则可能需要切换回索引循环,因为它比迭代器循环更清楚地传达您的意图.但是,如果将来程序的演变可能导致容器的更改,则应该坚持使用迭代器并使用std :: distance,这可以保证与所有标准迭代器一起使用.


QBz*_*ziZ 8

使用std :: distance更通用,因为它适用于所有迭代器,而不仅仅是随机访问迭代器.在随机访问迭代器的情况下,它应该与它一样快 - vec.begin().

它 - vec.begin()基本上是指针算术.


Car*_*org 6

std::distance(vec.begin(), it)会给你索引it指向,假设它指向vec.

卡尔