Если ли разница при определении типа вектора через указатель или без?
Есть ли разница в расположении ресурсов в памяти, и работы с ней в этих 2х случаях, и какой из них предпочитать?
1)
vector<std::vector<T*>*> *values = new vector<vector<T*>*>(1000,new vector<T>(1000, new T()));
или так
2)
vector<std::vector<T>> *values = new vector<vector<T>>(1000,vector<T>(1000,T()));
если есть разница, то как очищать память?
для первого случая
for(auto a = 0;a<values->size();a++){
for(auto b = 0;b<values[a].size();b++){
delete values[a][b];
}
delete values[a];
}
delete values;
или так?
delete values;
Ответы (2 шт):
В первом случае у вас
vector<std::vector<T*>*> *values =
new vector<vector<T*>*>(1000,new vector<T>(1000, new T()));
все 1000 элементов первого вектора будут одним и тем же указателем на вектор, в котором будет храниться 1000 одинаковых указателей на одно и то же значение типа T!
И вообще - куда меньше проблем с выделением-освобождением памяти будет во втором случае, так что используйте его (и без указателя!):
vector<std::vector<T>> values(1000,vector<T>(1000,T{}));
Если зачем-то (зачем?...) вам позарез нужен указатель - ну, тогда
vector<std::vector<T>> *values =
new vector<vector<T>>(1000,vector<T>(1000,T()));
...
delete values;
Но особого смысла не вижу.
Освобождение памяти в первом случае - если вы его исправите - слишком большое и сложное, одно это лишает смысла весь код (да и работать с такой структурой - запутаетесь в разыменованиях). Не для того вектора делали :)
P.S. Еще - в первом случае лишнее косвенное обращение (и далеко не одно!) в принципе вносит свой вклад и приводит к уменьшению производительности...
Технически, разницы нет - так как вектор хранит данные не внутри своего объекта, а на куче, что в первом, что во втором случае, данные не будут лежать в памяти одним большим куском подряд.
Второй случай будет просто запутывать программиста и провоцировать трудноуловимые ошибки (множество которых вы и наделали)
Для некоторых алгоритмов на некоторых данных более предпочтительно держать все данные в памяти одним большим куском (когда все данные имеют по размеру около мегабайта (зависит от CPU, некоторые могучие XEONы могут и 60 мегабайт в кэше удержать) и могут уместится в кэш процессора).
В таком случае, лучше всего сделать:
std::vector<T> wad(width*height)
А индексацию организовать искусственно:
auto& item = wad[i+j*width]