как получить доступ (например, cout) к текущему значению итераторов в многомерных векторах STL (C ++) - PullRequest
1 голос
/ 02 мая 2011

Я все еще неофит в использовании STL.Следующий фрагмент кода заполняет трехмерный вектор (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, Srow) во время итерации.Как правильно разыменовать текущее значение Slayer, т.е.

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

Ответы [ 3 ]

1 голос
/ 02 мая 2011

Если вам нужен текущий вектор "index", я думаю, что стандартный способ сделать это - увеличить другое значение.

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 () изитератор, но он не работает хорошо со всеми типами итераторов (мне не хватает времени на выполнение некоторых тестов).

0 голосов
/ 02 мая 2011

Таким образом, *Scol возвращает вам int в последнем векторе, *Srow даст вам вектор строки, *Slayer даст вам вектор слоев, содержащий вектор строк.

0 голосов
/ 02 мая 2011

Вы не можете сделать это напрямую.

Способ, которым я бы это сделал - определить функцию с циклом, чтобы сделать это для вас.


Что-то вроде:

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

Совет - используйте typedef вместо записи всех этих длинных вложенных векторов.

EDIT : Конечно, вы всегда можете перегрузить operator<< для этих типов (векторов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...