Использование итераторов это будет очень сложно. Я бы сказал, что вам, вероятно, понадобится implement your own iterator classes inheriting from std::iterator<random_access_iterator_tag, Type>
.
Если вам действительно не нужно использовать итераторы, и на самом деле у них есть веская причина для нежелательного перемещения векторов векторов таким нечетным образом (и они знают, как это замедлит доступ к памяти, предотвращая кеширование), тогда это можно легко сделать с помощью индексов.
Вот пример использования индексов, которые обрабатывают сложный случай, когда внутренние векторы не имеют одинаковой длины.
using namespace std;
int main()
{
vector< vector<int> > vec_2d = { {1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10} };
bool is_col_out_of_bounds = false;
for (size_t col=0; ! is_col_out_of_bounds; col++)
{
is_col_out_of_bounds = true;
for (size_t row=0; row<vec_2d.size(); row++)
{
if (col < vec_2d[row].size())
{
is_col_out_of_bounds = false;
cout << vec_2d[row][col] << endl;
}
}
}
return 0;
}
Выход:
1
4
8
2
5
9
3
6
10
7
Если вы хотите, чтобы гарантировать, что все строки имеют одинаковую длину, то vector<array<T, N>>
может быть лучшим выбором.
Просто используйте индексы. –
Просто проверьте, есть ли лучшие методы, которые используют индексы. – user109260
По моему опыту, если у вас есть индексированный контейнер, то итераторы, как правило, медленнее использовать, особенно после разыменования, чтобы получить значение, добавляет накладные расходы. – tinstaafl