1

例子:

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

我知道我可以检查向量中有多少项目,做一个计数器,等等。但我想知道是否有一种更直接的方法来检查当前索引,而无需断言我得到了正确的向量长度。

4

4 回答 4

2

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


编辑

如评论中所述,并非所有迭代器都支持 operator- 因此必须使用 std::distance 。但是,我不建议这样做,因为 std::distance 会导致非随机访问的迭代器产生线性时间性能成本,而如果您使用it - begin()编译器会告诉您这不起作用,然后您可以在必要时使用距离。

于 2012-12-19T17:59:48.637 回答
1

从当前迭代器中减去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支持常数时间的随机访问迭代器,也支持线性时间的其他类别的迭代器。

于 2012-12-19T18:00:27.033 回答
1

迭代器用于允许编写对容器选择不变的通用算法。我在STL Book中读到这很棒,但可能会导致性能下降,因为有时容器的成员函数针对容器进行了优化,并且比依赖迭代器的通用代码运行得更快。在这种情况下,如果您正在处理一个大向量,您将调用 std::distance,虽然常量不是必需的。如果你知道你将在这个算法中使用 oly 向量,你可能会认识到它支持直接访问运算符“[]”并编写如下内容:

#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; 
}

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

于 2012-12-19T18:11:14.257 回答
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;
}
于 2012-12-19T18:02:16.087 回答