当前位置:  开发笔记 > 编程语言 > 正文

使用迭代器获取向量索引

如何解决《使用迭代器获取向量索引》经验,为你挑选了3个好方法。

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

std::vector vec;
std::vector::iterator it;
for ( it = vec.begin(); it != vec.end(); ++it )
{
   // do work
}

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

    恢复到索引循环

    std::vector vec;
    size_t i;
    for ( i = 0; i < vec.size(); ++i )
    {
       // use i
    }
    

    计算偏移量

    std::vector vec;
    std::vector::iterator it;
    for ( it = vec.begin(); it != vec.end(); ++it )
    {
       size_t i = it - vec.begin(); 
       // use i
    }
    

    使用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 Touraill.. 13

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



1> Luc Touraill..:

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



2> QBziZ..:

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

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



3> Carl Selebor..:

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

卡尔

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有