迭代矢量如何检查我的位置

iterating a vector how to check at which position I am?

本文关键字:检查 我的 位置 何检查 迭代      更新时间:2023-10-16

示例:

for (vector<string>::reverse_iterator it = myV.rbegin(); it != myV.rend(); ++it)
{
  cout << "current value is: " << *it << ", and current position is: " << /*  */ << endl;
}

我知道我可以检查矢量中有多少个项目,制作计数器,依此类推。但是我想知道是否有更直接检查当前索引的方法,而无需断言我正确的矢量。

向量迭代器支持差异您可以从rbegin中减去当前迭代器。


编辑

正如评论中指出的,并非所有迭代器都支持操作员-STD ::距离必须使用。但是,我不建议这样做,因为std ::距离会导致迭代器的衬里时间性能成本,而迭代器不是随机访问的,而如果您使用it - begin(),则编译器会告诉您不起作用,然后如果必须,则可以使用距离。

从当前迭代器中减去std::vector<T>::begin()(或rbegin())。这是一个小例子:

#include <vector>
#include <iostream>
int main()
{
    std::vector<int> x;
    x.push_back(1);
    x.push_back(1);
    x.push_back(3);
    std::cout << "Elements: " << x.end() - x.begin();
    std::cout << "R-Elements: " << x.rend() - x.rbegin();
    return 0;    
}

正如上面非常出色的评论中指出的那样,std::distance可能是一个更好的选择。std::distance支持在恒定时间内随机访问迭代器,但也支持线性时间的其他类别。

迭代器用于允许将通用算法写入容器的选择。我在STL书中读到这很棒,但是可能导致性能下降,因为有时容器的成员功能对容器进行了优化,并且比依赖迭代器的通用代码更快地运行。在这种情况下,如果您要处理大型向量,则将调用std ::距离,尽管不需要常数。如果您知道您将使用Oly Vector作为此算法,则可以认识到它支持直接访问操作员" []"并写下类似的内容:

#include <vector>
#include <iostream>

using namespace std;
int main ()
{

    vector<int> myV;

    for (int I = 0; I < 100; ++I)
    {
        myV.push_back(I); 
    }

    for (int I = 0; I < myV.size(); ++I)
    {
        cout << "current value is: " << myV[I] 
            << ", and current position is: " << I << endl;
    }

    return 0; 
}

如果您对速度感兴趣,则可以随时尝试在此处提出的不同答案并测量执行时间。这可能取决于向量大小。

保持反面:

for (vector<string>::reverse_iterator it = myV.rbegin(), 
                                 int pos = myV.size; 
     it != myV.rend(), 
         --pos; 
     ++it)
{
    cout << "current value is: " << *it << ", and current position is: " << pos << endl;
}