Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
spyphy
2 / 2 / 1
Регистрация: 03.11.2012
Сообщений: 110
1

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

22.08.2013, 14:02. Просмотров 1154. Ответов 13
Метки нет (Все метки)

Нужно время от времени ложить в 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 (при этом можно будет ограничиться побитовым копированием данных)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2013, 14:02
Ответы с готовыми решениями:

Вектор наподобие STL
Закончил реализацию. Выкладываю, ибо может кому пригодится. + Кому не лень -...

Вектор (не из STL) из структур
привет Ребят, задача была поставлена так: нужно сделать прогу, которая бы...

Удаление динамических объектов
есть программа, в которой реализован список объектов, создающиеся динамически....

Библиотека STL, класс вектор
Помогите написать прогу... вот задание: Использовать класс vector библиотеки...

Как устроен вектор (STL) ?
Вот такой вот вопросец возник. Как организовано хранение вектора в памяти?...

13
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
22.08.2013, 14:15 2
Способ 1 предпочтительный. Если же ты хочешь попытаться избежать "тяжелого" копирования данных, то рассмотри возможность помещать в список не сами "тяжелые" объекты, а прокси-объекты, содержащие только указатели на реальные объекты (возможно, какой-нибудь shared_ptr<> или unique_ptr<> или etc.). В общем, смотри на идиому pImpl.
0
za5
442 / 346 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
22.08.2013, 14:20 3
я бы указатели в вектор положил
0
spyphy
2 / 2 / 1
Регистрация: 03.11.2012
Сообщений: 110
22.08.2013, 14:35  [ТС] 4
если указатели хранить в списке, то обращение к методам объекта по итератору it так?
Код
(*it)->func()
,
что тоже самое
Код
(*(*it)).func()
. немного громоздко, хотя можно попробывать.
0
Kuzia domovenok
2327 / 2074 / 482
Регистрация: 25.03.2012
Сообщений: 7,399
Записей в блоге: 1
22.08.2013, 15:19 5
Цитата Сообщение от spyphy Посмотреть сообщение
при этом требуется реализация конструктора копирования, и если класс достаточно большой и часто модифицируется, а для других целей конструктор копирования в общем то и не нужен, то имеет ли смысл заморачиваться?
имеет
0
spyphy
2 / 2 / 1
Регистрация: 03.11.2012
Сообщений: 110
22.08.2013, 15:44  [ТС] 6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
имеет
какие аргументы будут в пользу этого? можно ссылку на литературу скинуть, если лень писать
(замечу, что код только для личного использования предназначен)
0
Kuzia domovenok
2327 / 2074 / 482
Регистрация: 25.03.2012
Сообщений: 7,399
Записей в блоге: 1
22.08.2013, 15:52 7
http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)
0
spyphy
2 / 2 / 1
Регистрация: 03.11.2012
Сообщений: 110
22.08.2013, 16:15  [ТС] 8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Да вижу, что есть какие-то стандарты, хотя не вижу обоснования с точки зрения эффективности (т.е. скорость + размер кода). Ладно, еще гляну, что там Страуструп пишет...
0
Kuzia domovenok
2327 / 2074 / 482
Регистрация: 25.03.2012
Сообщений: 7,399
Записей в блоге: 1
22.08.2013, 16:38 9
О чём вообще спор? Тебе сложно конструктор копирования написать?
0
Croessmah
++Ͻ
14616 / 8368 / 1578
Регистрация: 27.09.2012
Сообщений: 20,563
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 16:45 10
У Вас будет куча разбросанных в памяти объектов и указателей на них ( они тоже память кушают ).
Ну а если исключение? Вектор почистит за собой, вызвав деструкторы объектов. А если хранить указатели, то придется оборачивать эти указатели, или освобождать память вручную, о чем можно запросто забыть.
Если объекты тяжело копировать, то можно посмотреть на семантику перемещения.

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

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

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

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

создать вектор STL в классе
Здравствуйте всем Вопрос касается STL векторов внутри класса. Ситуация такая:...

Можно ли создать вектор динамических массивов?
В больном воображении созрел такой код char**mass = new char*();...

Декларирование атрибутов динамических объектов
Здравствуйте. Пишу шахматную программу. Решил использовать динамические...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru