Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
#1

Является ли адаптер контейнера контейнером - C++

26.07.2016, 16:10. Просмотров 1144. Ответов 62
Метки нет (Все метки)

75%, но некоторые вопросы вызывают недоверие. Например вопрос про стандартные контейнеры (нужно выбрать стандартные контейнеры из списка), один из вариантов std::queue, вот и думай - то ли автор вопроса плохо знает С++ и нужно выбрать std::queue, то ли автор знает С++ на достаточном уровне и std::queue выбирать не надо (т.к. это не контейнер, а адаптер). Другие вопросы тоже можно покритиковать.

 Комментарий модератора 
Вынесено из темы: http://www.cyberforum.ru/cpp-beginne...ad1785281.html
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2016, 16:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Является ли адаптер контейнера контейнером (C++):

Детектировать, является ли контейнером set или является multiset - C++
здравствуйте, вот есть детектирование является ли контейнер map или multimap: template< typename... > using void_t = void; ...

Целью работы является создание программы для обработки набора объектов с использованием класса -контейнера - C++
Целью работы является создание програмки для обработки набора объектов с использованием класса -контейнера динамический массив ( vector...

Проблемы с контейнером - C++
имеются следующие типы: typedef int (*CLI_Function ) ( const std::vector <const std::string> arguments, void * data ); typedef std::map...

задача с контейнером - C++
помогите с решение задачи с контейнером Создать контейнер "мультимножество" с элементами типа int. Контейнер пустой. Заполнить его...

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

Операция с контейнером vector - C++
Что в этой строке происходит с вектором до знака "="? vector<bool>& vec = p->second; Спасибо)

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
26.07.2016, 17:51  [ТС] #16
Цитата Сообщение от hoggy Посмотреть сообщение
мы оборачиваем std::vector нашим адаптером,
который определяет нужный клиентам паблик интерфейс,
и просто делегирует задачу std::vector.
в случае с queue все иначе.
почему с queue иначе? queuе - это как раз описанный пример с вектором.
0
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
26.07.2016, 17:52 #17
hoggy, тогда любой объект, который хранит контейнер является контейнером

Добавлено через 50 секунд
Цитата Сообщение от shilko2013 Посмотреть сообщение
Эт другое дело
Это не другое дело.
Я же писал, что будут придираться к подобным формулировкам.
Вы их не поменяли - получайте.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
26.07.2016, 17:56  [ТС] #18
Сижу в MSVC, поэтому вот очередь из майкросовфтовской реализации (удалил из кода кучу конструкторов и операторов для наглядности)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
template<class _Ty,
    class _Container = deque<_Ty> >
    class queue
    {   // FIFO queue implemented with a container
public:
    void push(value_type&& _Val)
        {   // insert element at beginning
        c.push_back(_STD move(_Val));
        }
 
    template<class... _Valty>
        void emplace(_Valty&&... _Val)
        {   // insert element at beginning
        c.emplace_back(_STD forward<_Valty>(_Val)...);
        }
 
 
    bool empty() const
        {   // test if queue is empty
        return (c.empty());
        }
 
    size_type size() const
        {   // return length of queue
        return (c.size());
        }
 
    reference front()
        {   // return first element of mutable queue
        return (c.front());
        }
 
    const_reference front() const
        {   // return first element of nonmutable queue
        return (c.front());
        }
 
    reference back()
        {   // return last element of mutable queue
        return (c.back());
        }
 
    const_reference back() const
        {   // return last element of nonmutable queue
        return (c.back());
        }
 
    void push(const value_type& _Val)
        {   // insert element at beginning
        c.push_back(_Val);
        }
 
    void pop()
        {   // erase element at end
        c.pop_front();
        }
 
    const _Container& _Get_container() const
        {   // get reference to container
        return (c);
        }
 
protected:
    _Container c;   // the underlying container
    };
по коду видно, что это простая обертка (с нужным интерфейсом) над контейнером.
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
26.07.2016, 18:17 #19
Цитата Сообщение от Kastaneda Посмотреть сообщение
почему с queue иначе?
потому что у queue - отличная от std::vector бизнес-логика.

когда вы используете std::queue,
то вы делаете это потому, что вам нужна бизнес-логика именно std::queue
а не std::vector, на котором он может базироваться

если бы вам был бы нужен std::vector,
то именно им бы вы и пользовались.
Цитата Сообщение от Kastaneda Посмотреть сообщение
queuе - это как раз описанный пример с вектором.
нет. это вообще из другой оперы.

std::queue не умеет того, что умеет std::vector.
и не нужен там, где нужен std::vector.

его бизнес-логика и паблик-интерфейс принципиально отличаются.

Цитата Сообщение от Croessmah Посмотреть сообщение
тогда любой объект, который хранит контейнер является контейнером
нет. не любой.

только тот, кто реализует функциональность контейнера.

Кликните здесь для просмотра всего текста
у меня например есть "формы" - контейнер,
который реализует паттерн "домики"
(я точно не знаю, как на самом деле называется этот паттерн.
но суть в том, что бы была возможность декларативно указать из чего состоит дерево,
узлами которого могут являться объекты разных типов)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// пример использования
auto form = 
  Form::create("form")
    .size(10,10)    
    .position(100,100)
    .title("Form")   
    .Widget<Box>("box1") 
      .size(10,10) 
      .position(100,100)
    .done()          
    .Widget<Box>("box2") 
      .size(10,10)
      .position(100,100)
    .done();
.done();
вот там под капотом тоже может быть некий контейнер.
но это - детали реализации.

теоретически, я мог бы вынести в итерфейс возможность указать
точный тип контейнера в котором будут храниться узлы.

от этого "форма" быть контейнером не перестанет.
так же, как и std::queue,
форма реализует свою собственную бизнес-логику.
которая сильно отличается от бизнес-логике того контейнера,
на котором она базируется.

кстати, для создания форм, мне пришлось реализовать, внимание:
итератор-адаптер и рекурсивный-итератор-адаптер.

итератор-адаптер параметризуется итератором любого "рекурсивного контейнера".
(рекурсивный контейнер - контейнер, элементы которого - контейнеры такого же типа)

и нацеливается на его "нативный итератор",
то есть итератор контейнера на котором базируется "рекурсивный контейнер".

и наделяют его дополнительным функционалом:
умением знать где начало коллекции,
где конец,
валиден ли он.

в общем, расширяет возможности стандартного интерфейса итераторов.

рекурсивный-итератор-адаптер базируется на итератор-адаптер,
и используя его расширенные возможности,
может гулять по рекурсивному контейнеру как угодно.
можно рекурсивно обойти все дерево.

вот это то, что под капотом "формочек".
и этот факт никак не делает сами формочки адаптером над какими то контейнерами.

у них, повторюсь, уникальный интерфейс, свои требования, свой дизайн,
своя область применения.

вот с std::queue - аналогично.
разница лишь в том,
что там наружу вытащили знание о контейнере,
на котором базируется бизнес-логика std::queue
1
shilko2013
240 / 217 / 117
Регистрация: 02.04.2016
Сообщений: 827
Завершенные тесты: 1
26.07.2016, 18:20 #20
Kastaneda, Я вам уже скидывал с сайта мелкомягких, что они думают по этому поводу.

Добавлено через 1 минуту
Контейнер — структура данных в программировании. вики
0
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
26.07.2016, 19:06 #21
hoggy, в этом вопросе я с Вами не согласен,
я предпочту различать контейнеры и адаптеры контейнеров.
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
26.07.2016, 19:07 #22
Цитата Сообщение от Croessmah Посмотреть сообщение
я предпочту различать контейнеры и адаптеры контейнеров.
и по каким признакам вы их различаете?
0
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
26.07.2016, 19:09 #23
hoggy, например, я могу обойти контейнер,
или знаю какую структуру данных он представляет (список, массив и т.д.).
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
26.07.2016, 19:22 #24
Цитата Сообщение от Croessmah Посмотреть сообщение
например, я могу обойти контейнер,
или знаю какую структуру данных он представляет (список, массив и т.д.).
то есть, вы считаете очередь "адаптером" (и не контейнером) только потому,
что она не поддерживает итераторы,
и вы не знаете какую структуру данных она представляет?

на самом деле структура данных вам известна.
std::queue представляет собой адаптер sequence containers.
об этом сказано в спецификации.

поддержка begin/end делается элементарно:

C++
1
2
3
4
using iteratir_type = decltype( std::decltype<container_type>().begin() );
...
 
iteratir_type begin() {  return m_container_type.begin(); }
для очереди это не реализовано лишь потому,
что ей это не нужно согласно её бизнес-логике.

вот если я влезу в исходники стандартной библиотеки,
и допишу комплект begin/end методов,
но все остальное останется прежним.
вы хотите сказать,
что это волшебным образом сделает очередь "не адаптером, а контейнером" ?

или возьмите любой контейнер, который не описан в стандарте.
например, мою формочку.
я из неё выпилю begin/end.
а что у неё под капотом вы не знаете.

и что, она от этого перестанет быть контейнером,
и станет адаптером?
0
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
26.07.2016, 20:17 #25
Цитата Сообщение от hoggy Посмотреть сообщение
что ей это не нужно согласно её бизнес-логике
Мы обсуждаем термины, а не бизнес-логику
Как Вы её сюда приплели - не понятно.
Согласно бизнес-логике, объект типа unique_ptr - указатель же?
А по сути - это не указатель, а объект некоего класса


Two basic container types:
sequences - items in the order they were explicitly placed into the container
- vector, list, deque
- adapted to stack, queue, priority-queue
....
stacks, queue, priority_queue
adapters - wrapper around a vector or other container
Это из Library Organization and Standard Containers.

Добавлено через 22 минуты
Кстати, у нас на работе есть труба, метров 20 в высоту,
так вот на схеме она подписана как stack.
Сижу и думаю, является она контейнером или нет
2
Fulcrum_013
718 / 743 / 73
Регистрация: 14.12.2014
Сообщений: 5,836
Завершенные тесты: 3
26.07.2016, 20:35 #26
Цитата Сообщение от hoggy Посмотреть сообщение
и что, она от этого перестанет быть контейнером
Вообще я бы в вел немного другое обозначение для термина "контейнер" - контейнером является структура хранящая указатели на объекты и имеющая средства слежения за их жизненным циклом (удаляющая их из себя при удалении объекта извне и удаляющая остатки при своем удалении (для контейнера-владельца)). А все остальное - банальные динамические массивы. Так что в STL контейнеров вообще нет.
0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
26.07.2016, 20:37 #27
Цитата Сообщение от Croessmah Посмотреть сообщение
Мы обсуждаем термины, а не бизнес-логику
термин - это слово, которое является названием некоторого понятия,
имеющего однозначное определение в некоторой предметной области.

например - в программировании.

дайте мне определения терминов "контейнер", и "адаптер".
и сопоставьте это все с очередью.

Цитата Сообщение от Croessmah Посмотреть сообщение
Согласно бизнес-логике, объект типа unique_ptr - указатель же?
нет.
это типа "смарт-поинтер".

задача указателя - хранить адрес объекта.

задача смарт-поинтера - определять стратегию владения ресурсами.

Цитата Сообщение от Croessmah Посмотреть сообщение
Это из Library Organization and Standard Containers.
да не нужно мне это все цитировать.
я знаком с формальной стороной дела.

вы вообще знаете почему очередь называется адаптером?
это - полноценный самостоятельный механизм
с собственным дизайном, и тп.

но при этом, очередь позволяет адаптировать её под ключ задачи,
для более эффективного решения.

где то эффективнее, если элементы очереди живут в векторе.
а где то - в листе, например.

однако это не очередь адаптирует вектор под ключ задачи.
это она сама адаптирует собственную реализацию
под ключ задачи.

там где используется очередь, вектор никому не нужен.
нужна именно очередь, которую можно кастомизировать,
подстраивая под ключ конкретной задачи.

понимаете?
1
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
26.07.2016, 20:43 #28
Цитата Сообщение от hoggy Посмотреть сообщение
где то эффективнее, если элементы очереди живут в векторе.
а где то - в листе
Другими словами, само хранение очередь делегирует контейнеру,
сама при этом - лишь обертка. У меня всё.
Я же написал уже, что не согласен.
Не нужно меня переубеждать,
это дело крайне неблагодарное
0
Fulcrum_013
26.07.2016, 20:45
  #29

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
там где используется очередь, вектор никому не нужен.
нужна именно очередь, которую можно кастомизировать,
подстраивая под ключ конкретной задачи.
Ну как это не нужен? К примеру в работе универсального преобразователя стека в очередь, так же известного под брендом "автомат Калашникова", вектор направления ствола имеет ключевую роль в решении конкретной задачи.

0
hoggy
Нарушитель
6566 / 2747 / 474
Регистрация: 15.11.2014
Сообщений: 6,096
Завершенные тесты: 1
26.07.2016, 20:48 #30
Цитата Сообщение от Croessmah Посмотреть сообщение
Другими словами, само хранение очередь делегирует контейнеру,
сама при этом - лишь обертка.
она не "лишь обертка".
она - полноценный класс с собственной отличающийся
от всяких векторов бизнес-логикой.

вы написали класс, бизнес-логика которого не имеет ни малейшего отношения к строкам.
какой нибудь шаблоно-класс персон студенческих.
для решения собственной задачи у него есть мембер: std::string.
причем есть возможность указать альтернативный тип, через параметр шаблона.
хотите - std::string, а хотите - user::string

по вашей логике получается,
что персоны - это на самом деле "всего лишь обертки" над стрингой?

они ведь хранят данные в строке.
делегируют ей задачи для хранения.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2016, 20:48
Привет! Вот еще темы с ответами:

работа с контейнером map - C++
Есть программа, она с файла забирает значения. В файле набор цифр 1 2 45 2 3 60 1 2 60 Вывод я сделал, а вот вторая часть ставит в...

Работа с контейнером string - C++
Допустим инициализирую переменную типа string, никакого значения ей не присваиваю, потом вывожу.Почему выводится пустота?А не к примеру...

Работа с контейнером multimap - C++
Помогите пожалуйста. Вот вся задача: Определить класс autoOwnerDirectory (каталог автовладельцев), хранящий информацию об автовладельцах...

Работа с контейнером map, запрос на выборку - C++
Здравствуйте дамы и господа. Возник вопрос std::map&lt;std::pair&lt;int, int&gt;, Cell&gt; myVek; myVek = Cell(20, 20, false, false); Не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.07.2016, 20:48
Ответ Создать тему
Опции темы

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