вектор векторов для работы с двумерным массивом. вопрос

В видеоуроке по алгоритмам и структурам данных на ютубе увидел пример использования вектора (версия1), хотя раньше приходилось использовать другой пример из интернета (версия2). Есть ли между ними какая-либо разница, надо ли во втором случае использовать reserve(m*n)?

---1 версия---

std::vector<std::vector<uint64_t>>K;
K.resize(n + 1);
for (int i=0; i<=n;i++){
K[i].resize(m + 1); }

---2 версия---

std::vector<std::vector<int>>mass(m, std::vector<int> (n));

Ответы (1 шт):

Автор решения: Harry

У вас вообще-то разный результат получается...

std::vector<std::vector<uint64_t>>K;
K.resize(n + 1);
for (int i=0; i<=n;i++){
    K[i].resize(m + 1); 
}

создает матрицу (n+1)x(m+1), в то время как второй вариант -

std::vector<std::vector<int>>mass(m, std::vector<int> (n));

создает матрицу mxn. (О разных типах элементов говорить не буду :))

Как тут уже писали в комментариях, второй код и короче, и в общем случае быстрее. Никакой reserve() при этом использовать не надо - когда вы в конструкторе указываете размер, необходимая память выделяется сразу. Согласитесь, даже смешно говорить "выдели-ка мне N памяти, а потом зарезервируй мне ее".

И еще - несколько раз встречал странную ошибку - создав такую матрицу, люди вдруг начинали вносить в нее данные с помощью push_back() (и подумал, не с этими ли планами связан ваш вопрос о reserve). Нет, это уже ошибка - все элементы уже созданы и инициализированы нулевым значением.

→ Ссылка