инициализация вектора векторов с использованием конструктора заполнения - PullRequest
0 голосов
/ 23 октября 2019

Копирует ли при инициализации вектора векторов векторы n раз?

const int n, m; 
vector<vector<int>> v(n, vector<int>(m));

Эффективна ли инициализация или мы можем сделать ее лучше?

1 Ответ

4 голосов
/ 23 октября 2019

Копирует ли инициализация вектора векторов векторы n раз?

Да. Он будет делать N копий vector<int>(m), поэтому у вас будет N + 1 выделений.

Эффективна ли инициализация, или мы можем сделать ее лучше?

Это довольно хорошо, но ни в коем случае это лучшее, что вы можете сделать. Для необработанного исполнения вы хотите использовать один вектор и притвориться, что это 2d. Это выглядело бы как

std::vector<int> v(rows * cols);
v[row_index * cols + col_index] = 5; // same as 2d v[row_index][col_index] = 5;

Это делает одно выделение, и вы гарантированно, что все элементы находятся в одном блоке памяти. Двухмерный вектор не дает вам такой гарантии.

Чтобы упростить жизнь, вы можете инкапсулировать это в класс, чтобы перегрузить оператор [], чтобы он действовал как двумерная структура. Это делается путем перегрузки operator[] для класса и возврата в него прокси-типа, который содержит ссылку на строку вектора, и вы перегружаете operator[] для прокси-типа, чтобы он возвращал ссылку на col в том, что ссылается навектор.

...