Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Заблокирован
1

Зачем нужны адапторы контейнеров?

26.09.2012, 11:17. Показов 2091. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Объясните, пожалуйста, зачем нужны адаптеры контейнеров. Не понимаю смысл их существования, у них и функции какие-то кривые по сравнению с функциями контейнеров... И вообще непонятно, зачем, допустим, deque запихивать в stack, если она в первоначальном варианте обрабатывается намного лучше и легче?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2012, 11:17
Ответы с готовыми решениями:

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это...

Зачем нужны итераторы?
Практическое использование мне понятно - с их помощью обходят контейнеры и т.д и т.п.Но почему не...

Зачем нужны классы?
Изучаю СИ++ после изучения СИ. Не пойму какой смысл в классах. То что они делают можно реализовать...

Зачем нужны макросы?
Зачем нужны макросы?

17
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.09.2012, 11:24 2
AnreyKazakov, stack это stack. Он работает по несколько другому принципу, нежели дек. Адапторы контейнеров вполне удобная вещь.
1
Заблокирован
26.09.2012, 11:29  [ТС] 3
Цитата Сообщение от ForEveR Посмотреть сообщение
stack это stack. Он работает по несколько другому принципу, нежели дек. Адапторы контейнеров вполне удобная вещь.
Спасибо ForEveR, за такой Конкретыный ответ
0
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
26.09.2012, 11:36 4
Stack != Deque
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.09.2012, 11:38 5
AnreyKazakov, Просто вы задаетет странные вопросы. Как реализован стек - дело 10-е. Это абсолютно отдельная структура данных никак не относящаяся к деку.
1
Заблокирован
26.09.2012, 11:44  [ТС] 6
Цитата Сообщение от ForEveR Посмотреть сообщение
Просто вы задаетет странные вопросы.
Ну , а чего же тут странного, вы можете задачку какую-ниб привести, где просто необходимо использовать стековую структуру, или структуру очереди, мне кажется у контейнеров функционал куда шире, и если хочешь его можно использовать и как стек и как очередь... deque, например, просто не использовать некоторые функции вот вам и stack получился....

Добавлено через 1 минуту
Тем более стек как раз на базе очереди двухсторонней и реализован (по умолчанию)
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.09.2012, 11:47 7
AnreyKazakov, Стек - это абсолютно отдельная структура данных (я не про С++, а вообще). Если задача требует (по логике) использовать стек - используют стек, а не дек. Это же логично, разве нет? Плюс к тому, адапторы не имеют итераторов, они имеют ограниченный доступ к элементам и ограниченное кол-во функций. Собственно, несколько не логично пытаться забрать из стека 3-й элемент, не кажется?
1
Заблокирован
26.09.2012, 11:55  [ТС] 8
Цитата Сообщение от ForEveR Посмотреть сообщение
не логично пытаться забрать из стека 3-й элемент
Во, теперь начал понимать, наверное там и указателей нет, хотя если даже есть они в такой структуре не очень то нужны....
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
26.09.2012, 11:58 9
AnreyKazakov,
Например задача разбора мат/выражения - подсчета открывающих/закрывающих скобок. Используется стэк.
Пример очереди - какое-нибудь клиент-серверное игровое приложение, которое формирует сессионные игры в порядке живой очереди подключившихся.

С вашей логикой - вы выкинете все контейнеры, кроме какого-то одного. Зачем нам vector и queue, если есть deque?
1
Заблокирован
26.09.2012, 12:14  [ТС] 10
Цитата Сообщение от I.M. Посмотреть сообщение
С вашей логикой - вы выкинете все контейнеры, кроме какого-то одного. Зачем нам vector и queue, если есть deque?
Ага
Кстате, я одну задачу в таком роде так и не решил ....
Цитата Сообщение от I.M. Посмотреть сообщение
подсчета открывающих/закрывающих скобок
Надо было найти количество возможных вариантов расположения скобок в уравнении, если 3 пары, то варианты возм: ()()() , (())() , ()(()), (()()) , ((())) . Ну, я думаю, сейчас то уж точно решу, с адапторами.... =)

Добавлено через 1 минуту
А там количество пар по моему 7 равно было, так и не придумав вариант написания программы я перебрал вручную, минут за десять, но не угадал с ответом =((
0
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
16.10.2012, 16:19 11
Вот! Тот же вопрос зачем он нужен не понимаю? Суй везде vector и list да и всё? нет?
Надо тогда какую нибудь статистику провести чтоле, по производительности. Или про реализацию его почитать?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
16.10.2012, 16:26 12
Цитата Сообщение от maxon887 Посмотреть сообщение
Суй везде vector и list да и всё?
Нарисуйте себе на листе бумаги дек, вектор, лист и стек. Разница будет видна.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.10.2012, 22:08 13
Цитата Сообщение от maxon887 Посмотреть сообщение
зачем он нужен не понимаю? Суй везде vector и list да и всё? нет?
Когда программа пишется на высоком уровне, тем более с использованием ООП, необходимо понимать, что программист работает с программными объектами на некотором уровне абстракции. Если по логике задачи нужна именно стековая структура - логичнее, нагляднее, и, главное, с сохранением уровня абстракции нужно выбрать именно стек. Можно и вектором не пользоваться (абстракция, представляющая чёрный ящик-динамически расширяющуюся последовательность однотипных элементов), а использовать динамические или вообще здоровенные статические массивы. Но если задача по логике требует контейнер, динамически расширяющийся во время исполнения программы, то стоит использовать вектор. Ведь это тоже абстракция - динамическое расширение. На самом деле ничего не расширяется, а просто когда места не хватило - создаётся новая, большая по размеру область памяти, и туда копируются все старые данные, а старая область памяти удаляется. Но на некотором уровне абстракции мы видим именно динамическое расширение.
2
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
17.10.2012, 13:29 14
"Абстракция" - не нравиться мне это слово.Мол не твоё это дело как оно там работает(((((
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
17.10.2012, 13:30 15
Цитата Сообщение от maxon887 Посмотреть сообщение
"Абстракция" - не нравиться мне это слово.Мол не твоё это дело как оно там работает(((((
откройте фаил и посмотрите =)
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
17.10.2012, 15:14 16
Цитата Сообщение от maxon887 Посмотреть сообщение
Мол не твоё это дело как оно там работает(((((
Так и есть, программиста не волнует, что внутри контейнера, главное, что он работает так, как задокументировано.
Другими словами абстракция позволяет программисту абстрагироваться от внутреннего устройства контейнера (или чего-то дргугого).
Например потоки в/в тоже абстракция. Чтоб вывести слово на консоль мы используем оператор <<, этот же оператор мы используем, чтобы записать слово в файл. А то, что там вызываются совершенно разные функции, нас это не волнует. А то, что это ни какие не потоки, а объекты совершенно определенных классов, там это вообще дело десятое.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
17.10.2012, 18:49 17
Цитата Сообщение от maxon887 Посмотреть сообщение
Мол не твоё это дело как оно там работает(((((
В этом заключается суть ООП, в частности, одного из его китов - инкапсуляции. Как бы вы логичнее всего организовали std::vector, что вам приходит в голову? Мне лично сразу приходит в голову хранить его как указатель на начало выделенной памяти и размер. Ан нет, разработчики, например, реализации stl в gcc посчитали, что удобнее хранить вектор как адреса начала и конца памяти. Таким образом, при вызове метода std::vector::size размер вычисляется как разность этих адресов. Но программисту-то на эту подробность наплевать, ему главное, чтобы вектор свои задачи выполнял, не больше, не меньше.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.10.2012, 20:34 18
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Объясните, пожалуйста, зачем нужны адаптеры контейнеров. Не понимаю смысл их существования, у них и функции какие-то кривые по сравнению с функциями контейнеров...
Хотя бы для быстродействия. Допустим, что вам нужен именно стек(может понадобиться для различных алгоритмов). Допустим, что вы пишите под gcc и внезапно вам нужно перейти на студию. Если в gcc стек, реализованный через дек, был в несколько раз быстрее стека, реализованного через вектор, то в студии дек реализован через опу и беспощадно тормозит.
Тогда вы просто изменяете объявление своего стека с stack<int> на stack< int, vector<int> >
...
Профит.
0
17.10.2012, 20:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2012, 20:34
Помогаю со студенческими работами здесь

Зачем нужны исключения?
Добрый вечер, прочитал статью об исключениях, не очень понимаю, почему бы не заменить их просто...

Зачем нужны классы?
После Си решил попробовать Си++, после нескольких глав Дейтла понял что весь смысл плюсов в...

Зачем нужны указатели?
Интересует вопрос, зачем нужны указатели? Например почему лучше нужно объявлять переменные как...

Зачем нужны деревья?
Изучил тему деревья (осуществлял втавки, удаление, обходы и т.д.). Теперь хочу разобраться, зачем...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru