Basic - shared_ptr к вектору векторов значений
У меня есть вектор векторов объектов, содержащий всего несколько целых чисел.
Внешний вектор содержит сотни векторов, которые содержат от тысячи до сотен тысяч объектов данных.
Я использую библиотеку с большим количеством участия в shared_ptr, так что это то, что я буду использовать.
Как мне сохранить это, чтобы данные сохранялись в куче?
std::vector<std::shared_ptr<std::vector<Data>>>
std::vector<std::vector<std::shared_ptr<Data>>>
так далее
Как правильно справиться с этим?
2 ответа
Чтобы хранить что-то в куче, которую вы используете new
в с ++ или malloc
в с. Хотя я полагаю, что реализация вектора использует кучу, поскольку вектор является контейнером динамического размера. Так что в действительности, если вы добавляете элемент к вектору, этот элемент уже находится в куче, если только он не является указателем, в этом случае в куче находится только указатель, а не элемент, на который указывает указатель, как указывает @Oswald.
Как мне сохранить это, чтобы данные сохранялись в куче?
Если вам нужна ссылочная семантика, т. Е. Если вам нужно, чтобы значения в контейнере были псевдонимами для значений, на которые также ссылаются другие части кода, а изменения, сделанные в одной части кода, должны быть видны для других частей, содержащих псевдоним модифицированного Data
объект, я бы сказал, это правильное определение контейнера:
std::vector<std::vector<std::shared_ptr<Data>>>
Что касается вашего вопроса о том, откуда берется хранилище, std::vector
всегда распределяет свои элементы динамически в непрерывной области памяти, независимо от того, являются ли они shared_ptr
s, vector
с или Data
s.
Однако я бы порекомендовал вам подумать, действительно ли вам нужна ссылочная семантика или если этого недостаточно для хранения объектов типа Data
по стоимости внутри контейнеров:
std::vector<std::vector<Data>>
Это упростит ваш код, и вы также избавитесь от shared_ptr
память и время выполнения
Нужна ли вам ссылочная семантика - это то, что может сказать только вы, как разработчик вашего приложения. Предоставленной вами информации недостаточно для того, чтобы я мог сказать ее безо всякой неопределенности, но, надеюсь, этот ответ дал вам подсказку о тех добрых вопросах, которые вы должны себе задать, и каков будет ответ в каждом случае.