我正在迭代一个向量,需要迭代器当前指向的下标。下列方法的优缺点是什么?

It - vec.begin() std::距离(vec.begin ())


当前回答

我刚刚发现了这个:https://greek0.net/boost-range/boost-adaptors-indexed.html

    for (const auto & element : str | boost::adaptors::indexed(0)) {
        std::cout << element.index()
                  << " : "
                  << element.value()
                  << std::endl;
    }

其他回答

我喜欢这个:it - vec.begin(),因为对我来说,它清楚地表示“从开始的距离”。对于迭代器,我们习惯用算术来思考,所以-号是这里最清晰的指示符。

根据http://www.cplusplus.com/reference/std/iterator/distance/,由于vecc .begin()是一个随机访问迭代器,distance方法使用-操作符。

因此,从性能的角度来看,答案是相同的,但是如果任何人都必须阅读和理解您的代码,那么使用distance()可能更容易理解。

正如本叔叔和内文所表明的那样,两者都有很好的理由。哪一种“更好”取决于您想要的行为:您是希望保证常量时间行为,还是希望在必要时回落到线性时间?

它- vvector .begin()花费常数时间,但operator -仅在随机访问迭代器上定义,因此,例如,对于列表迭代器,代码根本无法编译。

Std::distance(vecc .begin(), it)适用于所有类型的迭代器,但如果用于随机访问迭代器,则只会是一个常量时间操作。

两者都不是“更好”。用你需要的那个。

我刚刚发现了这个:https://greek0.net/boost-range/boost-adaptors-indexed.html

    for (const auto & element : str | boost::adaptors::indexed(0)) {
        std::cout << element.index()
                  << " : "
                  << element.value()
                  << std::endl;
    }

我更喜欢std::distance(vic .begin(),它),因为它将允许我在没有任何代码更改的情况下更改容器。例如,如果你决定使用std::list而不是std::vector,后者不提供随机访问迭代器,你的代码仍然会被编译。因为std::distance根据迭代器的特性选择最佳方法,所以你也不会有任何性能下降。