如何访问(例如,cout)多维STL向量中的迭代器的当前值(c++)

how do I access (e.g., cout) the current value of iterators in multi-dimensional STL vectors (C++)

本文关键字:迭代器 c++ 向量 多维 访问 何访问 例如 cout STL      更新时间:2023-10-16

在使用STL方面我还是个新手。下面的代码片段填充了一个3D向量(S)并编译得很好(g++)。

const int maxBonds = 6;
vector< vector< vector<int> > > S;
S.resize(maxBonds);
populate(S); // function that returns S with various layers filled with int data in rows and columns.
for (vector<vector<vector<int> > >::iterator Slayer = S.begin(); Slayer != S.end(); Slayer++) {
    cout << "Layer contains " << Slayer->size() << " rows" << endl;
    for (vector<vector<int> >::iterator Srow = Slayer->begin(); Srow != Slayer->end(); Srow++) {
        for (vector<int>::iterator Scol = Srow->begin(); Scol != Srow->end(); Scol++) {
            cout << *Scol;
        }
        cout << endl;
    }
    cout << endl;
}

运行正常:

Layer contains 0 rows
Layer contains 5 rows
000
200
020
220
002
Layer contains 12 rows
100
010
210
... // etc.

但是,我想在迭代期间打印出外部迭代器(Slayer, snow)的值。如何正确地解引用Slayer的当前值,即

 cout << "Layer # " << Slayer->??? << " contains " << Slayer->size() << " rows" << endl;

如果您需要的是当前矢量"索引",我认为这样做的标准方法是增加另一个值。

unsigned int countSlayer = 0;
for (vector<vector<vector<int> > >::iterator Slayer = S.begin(); Slayer != S.end(); Slayer++, ++countSlayer) {
    cout << "Layer # " << countSlayer << " contains " << Slayer->size() << " rows" << endl;
    for (vector<vector<int> >::iterator Srow = Slayer->begin(); Srow != Slayer->end(); Srow++) {
        for (vector<int>::iterator Scol = Srow->begin(); Scol != Srow->end(); Scol++) {
            cout << *Scol;
        }
        cout << endl;
    }
    cout << endl;
}

您也可以尝试从迭代器中减去begin(),但它并不适用于所有迭代器类型(我没有时间进行一些测试)。

所以*Scol得到的是最后一个向量中的整型,*Srow得到的是行向量,*Slayer得到的是包含行向量的层向量

你不能直接这么做。

我的做法是——定义一个带循环的函数来帮你完成。


类似:

void Print2dIntVector( const vector<vector<int> >& v )
{
    // ..
}
void Print3dIntVector( const vector< vector< vector<int> > >& v )
{
    // ..
}

建议-使用typedef,而不是写所有这些长,嵌套向量。

EDIT:当然,您总是可以为这些类型(向量)重载operator<<