Станд.:: вектор, копирующий объекты с push_back?

После большого количества расследований с valgrind я сделал заключение что станд.:: вектор делает копию объекта, который Вы хотите к push_back.

Это действительно верно? Вектор не может сохранить ссылку или указатель объекта без копии?!

Спасибо

157
задан jjxtra 16 February 2010 в 18:00
поделиться

5 ответов

Да, std :: vector :: push_back () создает копию аргумента и сохраняет ее в векторе. Если вы хотите сохранить указатели на объекты в вашем векторе, создайте std :: vector <любой *> вместо std :: vector .

Однако вам необходимо убедиться, что объекты, на которые ссылаются указатели, остаются действительными, пока вектор содержит ссылку на них (интеллектуальные указатели, использующие идиому RAII, решают проблему).

174
ответ дан 23 November 2019 в 21:45
поделиться

std :: vector всегда копирует все, что хранится в векторе.

Если вы сохраняете вектор указателей, то он будет копировать указатель, но не экземпляр, на который указывает указатель. Если вы имеете дело с большими объектами, вы всегда можете (и, вероятно, должны) использовать вектор указателей. Часто использование вектора интеллектуальных указателей подходящего типа хорошо для целей безопасности, поскольку в противном случае обработка времени жизни объекта и управление памятью могут быть сложными.

15
ответ дан 23 November 2019 в 21:45
поделиться

std :: vector не только создает копию того, что вы отправляете обратно, но в определении коллекции указано, что он будет это делать, и что вы не можете использовать объекты без правильной семантики копирования в векторе. Так, например, вы не используете auto_ptr в векторе.

3
ответ дан 23 November 2019 в 21:45
поделиться

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

0
ответ дан 23 November 2019 в 21:45
поделиться

В приложении блога Пост является сущностью, а тэг - объектом значения. У тэг нет удостоверения личности. Необходимо иметь:

  • Репозиторий
  • Проводка (сущность)
  • Тэгов (объект значения)

Проводка получила список тэгов.

Вопросы:

1: Я также прочитал, что не рекомендуется, чтобы доменная сущность общалась с доменной службой. Это правда?

Да, это не хорошая практика. Вы сущность не хотите связываться с доменной службой. Если вы сделаете это, вы не сможете использовать их позже. Вам пришлось рассмотреть возможность запуска события домена. Вы можете сказать своей области обслуживания сделать что-то fire доменных событий.

2.: Можно ли получить ссылку на доменную службу PostServices с помощью метода создания фабрики. например, IPostService PostService = ServiceUtil.GetPostService (); return PostService.GetTags (Post.content);

Да, это возможно. Заводской метод может возвращать абстрактный класс или интерфейс. Это хороший принцип разработки программного обеспечения «код для интерфейса, а не для реализации». Если вы это сделаете, вы сможете изменить свою реализацию позже, и вам не придется менять код вашего клиента.

3: Допустимо ли подключение доменной службы к API третьей стороны?

Я не рекомендую вам это, но это допустимо.

Извините, я не понимаю вопрос 4.

Посмотрите эту ссылку. Надеюсь, это поможет тебе.

https://stackoverflow.com/questions/901462/ddd-where-is-it-most-appropriate-to-get-a-list-of-value-objects/901562#901562

-121--4055796-

В случае производительности ленивые квантификаторы не всегда быстрее из-за обратного отслеживания: http://blog.stevenlevithan.com/archives/greedy-lazy-performance

Что касается фактического дизайна, я честно не могу сказать, почему квантификаторы жадны по умолчанию, но мне интересно, какой контрольный символ был бы использован для создания кванта Не думаю, что ? порезал бы его: -)

-121--1339679-

Да, std:: vector хранит копии. Как вектор должен знать ожидаемое время жизни объектов?

Если вы хотите передать или разделить владение объектами, используйте указатели, такие как shared _ ptr (см. Boost или TR1 ), чтобы упростить управление ресурсами.

34
ответ дан 23 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: