Копирует ли инициализация вектора векторов векторы 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 в том, что ссылается навектор.