Как добраться до N-го элемента 2d std :: vector (`std :: vector <std :: vector <T>>`)? - PullRequest
1 голос
/ 11 ноября 2011

Нам дан некоторый int el_position номер, который является позицией искомого нами элемента в развернутом представлении нашего 2-го вектора (std::vector< std::vector<int> > matrix(5, std::vector<int>(4))).

Значение, если бы у нас была такая матрица

11 21 31 41 51
61 71 81 91 101

и нам дали el_position == 7, нам нужно получить второй элемент второго ряда. Возможно ли сделать такое с помощью std stl 2d vector? Как получить значение элемента по заданной позиции в выровненном массиве?

Ответы [ 4 ]

4 голосов
/ 11 ноября 2011

Конечно, это возможно:

 row = el_position % row_length;
 col = el_position / row_length;
3 голосов
/ 11 ноября 2011
size_t size_y = matrix.front().size(); // to get your Y dimension
return matrix[el_position / size_y][el_position % size_y];
2 голосов
/ 11 ноября 2011

Вы просто берете один индекс n/W, а другой - n%W, где W - ширина (или длина строки, что угодно). Обратите внимание, что на самом деле в векторе векторов у вас могут быть векторы разной длины, так что решать вам нужно.

1 голос
/ 11 ноября 2011
// Assuming fixed dimensions:
matrix[el_position/size][el_position%size];

/ - целочисленное деление, поэтому вычисляет количество полных строк, которые мы должны пройти, чтобы найти искомую строку, а % - остаток от целочисленного деления, поэтому определяет, как далеко мы должны сместить в строка.

Если один из ваших внутренних векторов не будет одинакового размера, это не удастся. Вы можете проверить это предположение с двумя утверждениями:

assert(matrix.size()); // needed for the front element to be valid
assert(std::count(matrix.begin(), matrix.end(), matrix.front().size())
       == matrix.size()); // the count will be the number of elements 
                          // if it's correct
...