Форум программистов, компьютерный форум CyberForum.ru

STL вектор динамических объектов - C++

Восстановить пароль Регистрация
 
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 35
22.08.2013, 14:02     STL вектор динамических объектов #1
Нужно время от времени ложить в std::vector (или std::list) динамические объекты. Под динамическим объектом здесь понимается объект, который содержит некоторые данные, память под которые выделяется динамически с помощью оператора new.
Как лучше реализовать эту типичную задачу. Здесь вижу несколько вариантов:
1)
Код
MyClass ob; // выделение памяти с помощью new реализовано в конструкторе
list_ob.push_back(ob);
Способ вроде бы стандартный, однако при этом требуется реализация конструктора копирования, и если класс достаточно большой и часто модифицируется, а для других целей конструктор копирования в общем то и не нужен, то имеет ли смысл заморачиваться?... К тому же это лишнии затраты ресурсов.
2) хранить в списке указатели на объекты.
Код
MyClass *p = new MyClass;
list_ob.push_back(p);
Правда я пока не очень ясно представляю как будет происходить обращение к полям объектом по итераторам этого списка (легко можно будет запутаться где итератор, а где указатель).
3) выделение памяти с помощью new реализовать не в конструкторе, а отдельной функцией Init(), которую вызывать уже после того, как объекты будут положены в std::list (при этом можно будет ограничиться побитовым копированием данных)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2013, 14:02     STL вектор динамических объектов
Посмотрите здесь:

C++ создать вектор STL в классе
C++ Библиотека STL, класс вектор
Вектор наподобие STL C++
Как устроен вектор (STL) ? C++
Контейнер и получение динамических объектов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
22.08.2013, 14:15     STL вектор динамических объектов #2
Способ 1 предпочтительный. Если же ты хочешь попытаться избежать "тяжелого" копирования данных, то рассмотри возможность помещать в список не сами "тяжелые" объекты, а прокси-объекты, содержащие только указатели на реальные объекты (возможно, какой-нибудь shared_ptr<> или unique_ptr<> или etc.). В общем, смотри на идиому pImpl.
za5
440 / 344 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
22.08.2013, 14:20     STL вектор динамических объектов #3
я бы указатели в вектор положил
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 35
22.08.2013, 14:35  [ТС]     STL вектор динамических объектов #4
если указатели хранить в списке, то обращение к методам объекта по итератору it так?
Код
(*it)->func()
,
что тоже самое
Код
(*(*it)).func()
. немного громоздко, хотя можно попробывать.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
22.08.2013, 15:19     STL вектор динамических объектов #5
Цитата Сообщение от spyphy Посмотреть сообщение
при этом требуется реализация конструктора копирования, и если класс достаточно большой и часто модифицируется, а для других целей конструктор копирования в общем то и не нужен, то имеет ли смысл заморачиваться?
имеет
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 35
22.08.2013, 15:44  [ТС]     STL вектор динамических объектов #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
имеет
какие аргументы будут в пользу этого? можно ссылку на литературу скинуть, если лень писать
(замечу, что код только для личного использования предназначен)
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
22.08.2013, 15:52     STL вектор динамических объектов #7
http://en.wikipedia.org/wiki/Rule_of...2B_programming)
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 35
22.08.2013, 16:15  [ТС]     STL вектор динамических объектов #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Да вижу, что есть какие-то стандарты, хотя не вижу обоснования с точки зрения эффективности (т.е. скорость + размер кода). Ладно, еще гляну, что там Страуструп пишет...
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
22.08.2013, 16:38     STL вектор динамических объектов #9
О чём вообще спор? Тебе сложно конструктор копирования написать?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 16:45     STL вектор динамических объектов #10
У Вас будет куча разбросанных в памяти объектов и указателей на них ( они тоже память кушают ).
Ну а если исключение? Вектор почистит за собой, вызвав деструкторы объектов. А если хранить указатели, то придется оборачивать эти указатели, или освобождать память вручную, о чем можно запросто забыть.
Если объекты тяжело копировать, то можно посмотреть на семантику перемещения.

Зато если хранить указатели, то можно использовать прелести полиморфизма и т.д.

Добавлено через 1 минуту
Цитата Сообщение от spyphy Посмотреть сообщение
то имеет ли смысл заморачиваться?
Имеет. Конструктор копий и оператор присваивания, которые любезно предоставит компилятор могут не соответствовать требованиям, так что писать их всё равно придется. Ну или совсем их запретить.

Добавлено через 1 минуту
Цитата Сообщение от spyphy Посмотреть сообщение
К тому же это лишнии затраты ресурсов.
Тогда совсем без вектора делайте - ведь это тоже лишняя трата ресурсов.
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 35
22.08.2013, 16:58  [ТС]     STL вектор динамических объектов #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
О чём вообще спор? Тебе сложно конструктор копирования написать?
Ага, пожалуй это основной аргумент. Кроме того, в класс будут добавляться новые поля и их нужно будет не забыть параллельно вносить в конструктор копий. Хорошо еще, если не придется наследовать класс, иначе уже вносить изменения придется сразу в три и т.д. места. Неплохо б вообще сделать через ссылки (как в JAVA например, хотя JAVA мне не очень подходит).
Исключения применять не планирую.

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Тогда совсем без вектора делайте - ведь это тоже лишняя трата ресурсов.
В данном случае контейнеры STL мне удобны (хотя их только недавно начал использовать), хотя конечно можно и свой список реализовать, но тут всё равно указатели понадобятся.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 17:08     STL вектор динамических объектов #12
Цитата Сообщение от spyphy Посмотреть сообщение
Кроме того, в класс будут добавляться новые поля и их нужно будет не забыть параллельно вносить в конструктор копий.
Сначала просто нужно спроектировать класс
Цитата Сообщение от spyphy Посмотреть сообщение
Ага, пожалуй это основной аргумент.
Это не аргумент, а Ваша лень получается
Цитата Сообщение от spyphy Посмотреть сообщение
Исключения применять не планирую.
Вы не планируете, а в рантайме может всякое случиться. Полетит исключение из того же вектора и что тогда?
Обрабатывать их всё равно придется.
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 35
22.08.2013, 17:21  [ТС]     STL вектор динамических объектов #13
ок, спасибо. Я это и хотел уточнить, что имеется правильный способ и что это способ №1.
(какой из них буду использовать я пока загадка даже для меня)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2013, 17:23     STL вектор динамических объектов
Еще ссылки по теме:

Вектор (не из STL) из структур C++
C++ Удаление динамических объектов
C++ Динамический массив динамических объектов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 17:23     STL вектор динамических объектов #14
Цитата Сообщение от spyphy Посмотреть сообщение
что имеется правильный способ и что это способ №1.
Правильного способа нет - он зависит от конкретной ситуации
Yandex
Объявления
22.08.2013, 17:23     STL вектор динамических объектов
Ответ Создать тему
Опции темы

Текущее время: 00:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru