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から現在のイテレータを差し引くことができる違いをサポートします。


編集

コメントに記載されているように、すべてのイテレータが演算子をサポートしているわけではないため、std::distanceを使用する必要があります。ただし、これはお勧めしません。std:: distanceは、ランダムアクセスではないイテレータのライナー時間のパフォーマンスコストを引き起こしますがit - begin()、コンパイラを使用すると、それは機能しないと通知され、必要に応じてdistanceを使用できます。

于 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 を呼び出しますが、定数は必要ありません。このアルゴリズムにベクトルのみを使用することがわかっている場合は、直接アクセス演算子 "[]" をサポートしていることに気づき、次のように記述します。

#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 に答える