Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2014, 12:40   #1
RussDragon
Форумчанин
 
Аватар для RussDragon
 
Регистрация: 07.04.2012
Сообщений: 216
По умолчанию Выбор структуры данных

Здравствуйте, пишу УИ, появилась потребность в структуре данных для хранения разных виджетов. Массив указателей не подходит, т.к. он имеет фиксированный размер. Вектор тоже не самая лучшая идея. Дерево самое приемлемое, но сложно будет следить за освобождением памяти в большой иерархии. Прошу совета.
P.S. Смартпоинтеры не подойдут в связи с достаточно немаленькой иерархией разных виджетов.

Благодарю,
RussDragon
RussDragon вне форума Ответить с цитированием
Старый 18.01.2014, 14:20   #2
b2soft
Упртй программер
Форумчанин
 
Регистрация: 26.11.2009
Сообщений: 150
По умолчанию

чем вектор не устраивает? хранить иерархию неудобно? а что если хранить ключ+значение, где в ключе прописывать иерархическую связь? (ессно, не в векторе)
Помощь с кодом/лабами по С/С++
Контакты: ICQ 623334555 Skype: btwosoft; Mail: b2soft@yandex.ru

Последний раз редактировалось b2soft; 18.01.2014 в 16:42.
b2soft вне форума Ответить с цитированием
Старый 19.01.2014, 14:12   #3
RussDragon
Форумчанин
 
Аватар для RussDragon
 
Регистрация: 07.04.2012
Сообщений: 216
По умолчанию

Проблема не в сложности хранить иерархию в векторе. Для этого у меня в каждом виджете есть переменная ID (собственно, он и служит индексом/ключем). Мне не очень нравится то, как вектор хранит данные. При каждом новом добавленном элементе, он полностью копирует массив. Плюс к этому, я плохо понимаю, как сделать адекватное освобождение памяти в таком случае. Ведь если будет что-то вроде:
vector<UI_Widget*> List;
И он будет полностью заполнен, то при разрушении он эту самую память не освободит, я прав?

Последний раз редактировалось RussDragon; 19.01.2014 в 14:18.
RussDragon вне форума Ответить с цитированием
Старый 19.01.2014, 14:45   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от RussDragon Посмотреть сообщение
Для этого у меня в каждом виджете есть переменная ID (собственно, он и служит индексом/ключем).
Так индексом или ключем? Это весьма разные вещи.

Цитата:
Сообщение от RussDragon Посмотреть сообщение
При каждом новом добавленном элементе, он полностью копирует массив.
Вовсе нет. При добавлении в конец вектора память перемещается только время от времени. Добавляйте в конец и будет вам счастье. Ну, или не используйте vector...

Цитата:
Сообщение от RussDragon Посмотреть сообщение
Плюс к этому, я плохо понимаю, как сделать адекватное освобождение памяти в таком случае.
Какой бы вы контейнер не использовали, удаление из контейнера зависит от вас.

Цитата:
Сообщение от RussDragon Посмотреть сообщение
vector<UI_Widget*> List; И он будет полностью заполнен, то при разрушении он эту самую память не освободит, я прав?
При удалении из vector вызывается деструктор елемента. Что будет делать этот деструктор контейнер не волнует. То, что вы решили хранить обычный указатель это ваша проблема. То же самое относится ко всем std контейнерам.

Для правильного выбора контейнера надо плясать от нужного функционала - сформулируйте какой функционал вам нужен и станет ясно какой контейнер использовать.
waleri вне форума Ответить с цитированием
Старый 19.01.2014, 15:48   #5
RussDragon
Форумчанин
 
Аватар для RussDragon
 
Регистрация: 07.04.2012
Сообщений: 216
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
При удалении из vector вызывается деструктор елемента. Что будет делать этот деструктор контейнер не волнует. То, что вы решили хранить обычный указатель это ваша проблема. То же самое относится ко всем std контейнерам.

Для правильного выбора контейнера надо плясать от нужного функционала - сформулируйте какой функционал вам нужен и станет ясно какой контейнер использовать.
Функционал:
Есть иерархия виджетов (кнопки, поля и тп.), класс Сюрфейс содержит эти самые кнопки, которые размещены на поле. Требуется возможность добавления/удаления определенных элементов.
Вектор, по сути, подходит, но проблема с удалением памяти не особо веселит. Список. Та же проблема, либо делать деструктор/конструктор этой самой структуры, либо удалять память напрямую (в смысле, конкретно при удалении элемента списка, удалять к тому же и указатель в нем).
Как вариант, написать свой смартпоинтер, поддерживающий классовую-иерархию, что кстати, не такая плохая идея.
RussDragon вне форума Ответить с цитированием
Старый 19.01.2014, 16:09   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

При такой постановке вопроса, я бы выбрал list.
Не понимаю, в чем (по вашему) проблема удаления?
Зачем вам нужен смарт поинтер?
Где здесь вообще упомянутый ID?

Функционал, который вы требуете, это добавление/удаление элементов - для этого никакую память выделять/освобождать не надо.
waleri вне форума Ответить с цитированием
Старый 19.01.2014, 16:13   #7
RussDragon
Форумчанин
 
Аватар для RussDragon
 
Регистрация: 07.04.2012
Сообщений: 216
По умолчанию

Проблема в том, что объекты _обязаны_ быть выделены динамически.
RussDragon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор структуры данных в Run-time moon-guest Общие вопросы Delphi 0 15.07.2013 11:56
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39
Выбор данных по критерию Anatoly_K Microsoft Office Excel 1 16.07.2010 09:43
ВЫБОР НУЖНЫХ ДАННЫХ Slavik Microsoft Office Excel 4 13.04.2009 21:37
Выбор данных и суммирование rus_75 Microsoft Office Excel 6 28.02.2009 16:30