вектор векторов для работы с двумерным массивом. вопрос
В видеоуроке по алгоритмам и структурам данных на ютубе увидел пример использования вектора (версия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 шт):
У вас вообще-то разный результат получается...
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). Нет, это уже ошибка - все элементы уже созданы и инициализированы нулевым значением.