С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 40
#1

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

22.08.2013, 14:02. Просмотров 1024. Ответов 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 вектор динамических объектов (C++):

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

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

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

создать вектор STL в классе - C++
Здравствуйте всем Вопрос касается STL векторов внутри класса. Ситуация такая: есть изображение (двухмерная матрица) био клеток. Нужно...

Как устроен вектор (STL) ? - C++
Вот такой вот вопросец возник. Как организовано хранение вектора в памяти? Последовательно располагаются именно сами данные, или может быть...

Библиотека STL, класс вектор - C++
Помогите написать прогу... вот задание: Использовать класс vector библиотеки STL для хранения каталога книг. Книги характеризуются...

13
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
22.08.2013, 14:15 #2
Способ 1 предпочтительный. Если же ты хочешь попытаться избежать "тяжелого" копирования данных, то рассмотри возможность помещать в список не сами "тяжелые" объекты, а прокси-объекты, содержащие только указатели на реальные объекты (возможно, какой-нибудь shared_ptr<> или unique_ptr<> или etc.). В общем, смотри на идиому pImpl.
0
za5
442 / 346 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
22.08.2013, 14:20 #3
я бы указатели в вектор положил
0
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 40
22.08.2013, 14:35  [ТС] #4
если указатели хранить в списке, то обращение к методам объекта по итератору it так?
Код
(*it)->func()
,
что тоже самое
Код
(*(*it)).func()
. немного громоздко, хотя можно попробывать.
0
Kuzia domovenok
2078 / 1907 / 176
Регистрация: 25.03.2012
Сообщений: 6,572
Записей в блоге: 1
22.08.2013, 15:19 #5
Цитата Сообщение от spyphy Посмотреть сообщение
при этом требуется реализация конструктора копирования, и если класс достаточно большой и часто модифицируется, а для других целей конструктор копирования в общем то и не нужен, то имеет ли смысл заморачиваться?
имеет
0
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 40
22.08.2013, 15:44  [ТС] #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
имеет
какие аргументы будут в пользу этого? можно ссылку на литературу скинуть, если лень писать
(замечу, что код только для личного использования предназначен)
0
Kuzia domovenok
2078 / 1907 / 176
Регистрация: 25.03.2012
Сообщений: 6,572
Записей в блоге: 1
22.08.2013, 15:52 #7
http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)
0
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 40
22.08.2013, 16:15  [ТС] #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Да вижу, что есть какие-то стандарты, хотя не вижу обоснования с точки зрения эффективности (т.е. скорость + размер кода). Ладно, еще гляну, что там Страуструп пишет...
0
Kuzia domovenok
2078 / 1907 / 176
Регистрация: 25.03.2012
Сообщений: 6,572
Записей в блоге: 1
22.08.2013, 16:38 #9
О чём вообще спор? Тебе сложно конструктор копирования написать?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
22.08.2013, 16:45 #10
У Вас будет куча разбросанных в памяти объектов и указателей на них ( они тоже память кушают ).
Ну а если исключение? Вектор почистит за собой, вызвав деструкторы объектов. А если хранить указатели, то придется оборачивать эти указатели, или освобождать память вручную, о чем можно запросто забыть.
Если объекты тяжело копировать, то можно посмотреть на семантику перемещения.

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

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

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

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Тогда совсем без вектора делайте - ведь это тоже лишняя трата ресурсов.
В данном случае контейнеры STL мне удобны (хотя их только недавно начал использовать), хотя конечно можно и свой список реализовать, но тут всё равно указатели понадобятся.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
22.08.2013, 17:08 #12
Цитата Сообщение от spyphy Посмотреть сообщение
Кроме того, в класс будут добавляться новые поля и их нужно будет не забыть параллельно вносить в конструктор копий.
Сначала просто нужно спроектировать класс
Цитата Сообщение от spyphy Посмотреть сообщение
Ага, пожалуй это основной аргумент.
Это не аргумент, а Ваша лень получается
Цитата Сообщение от spyphy Посмотреть сообщение
Исключения применять не планирую.
Вы не планируете, а в рантайме может всякое случиться. Полетит исключение из того же вектора и что тогда?
Обрабатывать их всё равно придется.
0
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 40
22.08.2013, 17:21  [ТС] #13
ок, спасибо. Я это и хотел уточнить, что имеется правильный способ и что это способ №1.
(какой из них буду использовать я пока загадка даже для меня)
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

Контейнер и получение динамических объектов - C++
Привет. Как можно грамотно с точки зрения ООП реализовать класс-контейнер, где будут хранится объекты? Объекты не однотипные, а...

Динамический массив динамических объектов - C++
Физически задача поставлена так: есть узел который состоит из разных деталей, количество деталей в узле может быть разным; из узлов...

Можно ли создать вектор динамических массивов? - C++
В больном воображении созрел такой код char**mass = new char*(); //vector&lt;char*&gt;mass; int i = 0; for (char*ptr = strtok(buf, &quot;...

STL. Сортировка объектов в контейнере - C++
Имеется список list из объектов Time (минуты:секунды). Через собственный метод (list.sort(предикат)) сортировка проходит успешно, а при...


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

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

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