Заблокирован
|
|
1 | |
Зачем нужны адапторы контейнеров?26.09.2012, 11:17. Показов 2091. Ответов 17
Метки нет (Все метки)
Объясните, пожалуйста, зачем нужны адаптеры контейнеров. Не понимаю смысл их существования, у них и функции какие-то кривые по сравнению с функциями контейнеров... И вообще непонятно, зачем, допустим, deque запихивать в stack, если она в первоначальном варианте обрабатывается намного лучше и легче?
0
|
26.09.2012, 11:17 | |
Ответы с готовыми решениями:
17
Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? Зачем нужны итераторы? Зачем нужны классы? Зачем нужны макросы? |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.09.2012, 11:24 | 2 |
AnreyKazakov, stack это stack. Он работает по несколько другому принципу, нежели дек. Адапторы контейнеров вполне удобная вещь.
1
|
Заблокирован
|
|
26.09.2012, 11:29 [ТС] | 3 |
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.09.2012, 11:38 | 5 |
AnreyKazakov, Просто вы задаетет странные вопросы. Как реализован стек - дело 10-е. Это абсолютно отдельная структура данных никак не относящаяся к деку.
1
|
Заблокирован
|
|
26.09.2012, 11:44 [ТС] | 6 |
Ну , а чего же тут странного, вы можете задачку какую-ниб привести, где просто необходимо использовать стековую структуру, или структуру очереди, мне кажется у контейнеров функционал куда шире, и если хочешь его можно использовать и как стек и как очередь... 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 |
Во, теперь начал понимать, наверное там и указателей нет, хотя если даже есть они в такой структуре не очень то нужны....
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 |
Ага
Кстате, я одну задачу в таком роде так и не решил .... Надо было найти количество возможных вариантов расположения скобок в уравнении, если 3 пары, то варианты возм: ()()() , (())() , ()(()), (()()) , ((())) . Ну, я думаю, сейчас то уж точно решу, с адапторами.... =) Добавлено через 1 минуту А там количество пар по моему 7 равно было, так и не придумав вариант написания программы я перебрал вручную, минут за десять, но не угадал с ответом =((
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
16.10.2012, 22:08 | 13 |
Когда программа пишется на высоком уровне, тем более с использованием ООП, необходимо понимать, что программист работает с программными объектами на некотором уровне абстракции. Если по логике задачи нужна именно стековая структура - логичнее, нагляднее, и, главное, с сохранением уровня абстракции нужно выбрать именно стек. Можно и вектором не пользоваться (абстракция, представляющая чёрный ящик-динамически расширяющуюся последовательность однотипных элементов), а использовать динамические или вообще здоровенные статические массивы. Но если задача по логике требует контейнер, динамически расширяющийся во время исполнения программы, то стоит использовать вектор. Ведь это тоже абстракция - динамическое расширение. На самом деле ничего не расширяется, а просто когда места не хватило - создаётся новая, большая по размеру область памяти, и туда копируются все старые данные, а старая область памяти удаляется. Но на некотором уровне абстракции мы видим именно динамическое расширение.
2
|
17.10.2012, 15:14 | 16 |
Так и есть, программиста не волнует, что внутри контейнера, главное, что он работает так, как задокументировано.
Другими словами абстракция позволяет программисту абстрагироваться от внутреннего устройства контейнера (или чего-то дргугого). Например потоки в/в тоже абстракция. Чтоб вывести слово на консоль мы используем оператор <<, этот же оператор мы используем, чтобы записать слово в файл. А то, что там вызываются совершенно разные функции, нас это не волнует. А то, что это ни какие не потоки, а объекты совершенно определенных классов, там это вообще дело десятое.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.10.2012, 18:49 | 17 |
В этом заключается суть ООП, в частности, одного из его китов - инкапсуляции. Как бы вы логичнее всего организовали std::vector, что вам приходит в голову? Мне лично сразу приходит в голову хранить его как указатель на начало выделенной памяти и размер. Ан нет, разработчики, например, реализации stl в gcc посчитали, что удобнее хранить вектор как адреса начала и конца памяти. Таким образом, при вызове метода std::vector::size размер вычисляется как разность этих адресов. Но программисту-то на эту подробность наплевать, ему главное, чтобы вектор свои задачи выполнял, не больше, не меньше.
0
|
Higher
|
|
17.10.2012, 20:34 | 18 |
Хотя бы для быстродействия. Допустим, что вам нужен именно стек(может понадобиться для различных алгоритмов). Допустим, что вы пишите под gcc и внезапно вам нужно перейти на студию. Если в gcc стек, реализованный через дек, был в несколько раз быстрее стека, реализованного через вектор, то в студии дек реализован через опу и беспощадно тормозит.
Тогда вы просто изменяете объявление своего стека с stack<int> на stack< int, vector<int> > ... Профит.
0
|
17.10.2012, 20:34 | |
17.10.2012, 20:34 | |
Помогаю со студенческими работами здесь
18
Зачем нужны исключения? Зачем нужны классы? Зачем нужны указатели? Зачем нужны деревья? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |