1

多次元ベクトルを反復処理するエレガントな方法はありますか? たとえば、2D で十分だと思いますが、6D ベクトルがあるとします。何かのようなもの

vector< vector< int > myVector (6, vector<int> (5));

から始めて、これを反復するかなりの方法はありmyVector[0][0], myVector[0][1], ...etc?ますか? より大きな次元で試し、 Auto キーワードを使用してイテレータを生成しましたが、うまくいきません。これが私が試していたことです:

for(auto it = myVector.begin(); it < myVector.end(); ++it)
    std::cout << *it;

しかし、それはコンパイルされません。STLのイテレータについての私のさびた理解を許してください、それは長い間...

4

1 に答える 1

5

itは でありvector<vector<int>>::iterator、 を適用する*と が返されますがvector<int>、これは印刷できません。ループをループする必要があります。

for(auto i1 = myVector.begin(); i1 != myVector.end(); ++i1) // loops over the "external" vector
    for(auto i2 = i1->begin(); i2 != i1->end(); ++i2) // loops over the "internal" vectors
        std::cout << *i2;

任意の次元がある場合は、次を使用できます。

template <typename T>
void printVar(const T& v)
{
    std::cout << v;
}

template <typename T>
void printVar(const std::vector<T>& v)
{
    for (auto i = v.cbegin(); i != v.cend(); ++i)
    {
        printVar(*i);
    }
}

サンプルテスト。

于 2012-11-16T06:15:00.000 に答える