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_ptrs, vectorс или Datas.

Однако я бы порекомендовал вам подумать, действительно ли вам нужна ссылочная семантика или если этого недостаточно для хранения объектов типа Data по стоимости внутри контейнеров:

std::vector<std::vector<Data>>

Это упростит ваш код, и вы также избавитесь от shared_ptr память и время выполнения

Нужна ли вам ссылочная семантика - это то, что может сказать только вы, как разработчик вашего приложения. Предоставленной вами информации недостаточно для того, чтобы я мог сказать ее безо всякой неопределенности, но, надеюсь, этот ответ дал вам подсказку о тех добрых вопросах, которые вы должны себе задать, и каков будет ответ в каждом случае.

Другие вопросы по тегам