2016-12-02 2 views
0

У меня есть 2D и 3D векторИтерация 2D и 3D векторов столбцов в C++ 11?

using namespace std; 

vector< vector<int> > vec_2d; 
vector<vector<vector<int>>> vec_3d 

Я знаю, как итерацию 2D векторный рядам с помощью двух итераторов. Первый итератор «строк», а второй - итераторы «столбцов» в этой «строке». Теперь мне нужно выполнить итерацию по 2D-вектору, чтобы первый итератор стал итератором «столбцов», а второй - итератором строк в этом столбце, то есть по столбцам.

+0

Просто используйте индексы. –

+0

Просто проверьте, есть ли лучшие методы, которые используют индексы. – user109260

+0

По моему опыту, если у вас есть индексированный контейнер, то итераторы, как правило, медленнее использовать, особенно после разыменования, чтобы получить значение, добавляет накладные расходы. – tinstaafl

ответ

1

Использование итераторов это будет очень сложно. Я бы сказал, что вам, вероятно, понадобится 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>> может быть лучшим выбором.

0

Простой ответ: кто сказал, что ваш макет должен толковаться по-разному? A std::vector<std::vector<Foo>> не знает о строках и столбцах, поэтому пусть самый внешний вектор представляет столбцы вместо строк.

Это боль при печати на терминал, который, вероятно, сделает это по-разному, но если расположение столбцов предпочтительнее внутри, сделайте это именно так.

Смежные вопросы