![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
Сорри, за опять примитивный вопрос... Но я ща готовлюсь к экзаменам, и в лекциях, про них написано, что
Контейнеры ─ это множество классов, отличающихся типом исп. классов. И там немного воды, потом про какието библиотечные контейнеры написано, с учётом, что мне ещё непонятно, что это вообще такое до конца. Короче препод вообще ужасные лекции составил... А в книге по С++ при описании контейнеров, ссылка на 17 главу, где описано ещё много всякой всячены, к тому же про итераторы часто упомянается, а в вопросах к экзамену такого нет, так что если по книге тут можно ещё целый день, сидеть один вопрос учить. Если кому не трудно, то напишите пожалуйста ещё ситуацию, где эти контейнеры могут применятся, и маленький примерчик, чтобы мне понять суть вопроса. Заранее спасибо!!! |
|||
|
||||
| TIGERоX |
|
|||
|
начинающий... ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.9.2005 Репутация: нет Всего: 1 |
Классы контейнеры - это классы(обычно использующие шаблоны а может и необычно) которые хранят совокупности объектов
ну в них обычны есть такие методы как вставка сортировка удаление .... примеры так. классов очереди, связанные списки, стеки, очереди и т.д. Ну итерратор тоже по-моему неотъемленная часть такого класса(обычно описывается как друг класса)если он написан то он всего напросто возращает след. элемент совокупности элементов. например стек:
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Zero
Контейнеры это хранилище некоторых данных. Стандартные контенеры С++ это std::vector, std::list, std::map, std::set и т.д. Это шаблонные классы. Для примера std::vector это простой линейный динамический массив. Применяется везде где нужны массивы. Упрощает работу с элементами: добавление, удаление, итерации по ним.
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Контейнер - это класс, объекты которого предназначены для хранения других объектов.
Контейнеры в стандартной библиотеке C++ подразделяются на два типа: последовательности и ассоциативные контейнеры. К первым относятся: vector, list, deque. Ко вторым: map, multimap, set и multiset. Разница между ними следующая: в первых элементы храняться в том порядке, в котором они добавлялись/удалялись в контейнер. Во вторых порядок элементов определен свойствами самих элементов или связанных с ними объектов-ключей и не зависит от порядка добавления. vector можно представить себе как обертку над динамическим массивом, автоматически управляющую перераспределением памяти при добавлении/удалении элементов. (IIRC, в Delphi что-то подобное делает TList). list - это двухсвязный список. deque - нечто среднее, структура данных, позволяющее одновременно обеспечить быструю вставку и удаление элемента в начале и в конце, и произвольный доступ к элементам. map - вводит взаимно однозначное соответствие между некими объектами и их ключами. Пример: словарь - набор строк (слов одного языка) - это ключи - и каждой из них сопоставлено другая строка (перевод). По ключу можно быстро получить сопоставленный ему объект. multimap - то же самое, но одному ключу может соответствовать несколько объектов. set - множество. Аналогично встроенным множествам в Паскале, но может создаваться из любых объектов, для которых определено отношение порядка. multiset - то же самое, но допускает дубликаты. Итераторы... Ох, тут начинаются терминологические и прочие дебри. Попытаюсь доступно объяснить: Если у нас есть контейнер, то у нас должен быть способ обращаться к его элементам. Желательно не только обращаться, но и иметь возможность перебрать их все. Так вот: итератор - это объект, который позволяет это сделать. Итератор должен помнить, на какой объект он указывает, иметь возможность отдать этот объект коду, который его использует, перейти к следюущему объекту или уведомить клиентский код о невозможности такого перехода. Итератор (в общепринятом смысле этого слова) - это абстракция над любыми последовательностями. Так, например, код, который должен перебрать некоторые элементы, будет выглядеть одинаково для массива и связанного списка, если у них будет реализован интерфейс итератора.
Применительно к C++ понятие итератора несколько шире. Тут итераторы разделяются по возможностям, которые они предоставляют клиентскому коду. Есть пять уровней итераторов: ввода, вывода > последовательный > двунаправленный > произвольного доступа. Классический итератор, который я описал чуть выше - это последовательный (forward) итератор. Абстракция итераторов позволили создать в C++ STL библиотеку универсальных алгоритмов, которые применимы к любым структурам данных, для которых описан интерфейс итераторов - в частности, для любых стандартных контейнеров. Несколько сумбурно и многое пропущено... Но по возможности постараюсь уточнять и пояснять. Это сообщение отредактировал(а) Void - 15.1.2006, 00:06 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Zero |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
Void т.е. как я понял, контейнер это есть один класс??? А то препод нам дал такое определение:
Ещё вот такой пример давал:
Я только не понял, чё он этим примером хотел показать. Ведь судя по всему, у него имелось ввиду что Conteiner это класс-шаблон типа general... Весь прикол в том, что то что говоришь, ты похоже на то что написано в книге, правдо ассоциативные контейнеры я пока ненашёл PS: а иетратор, я смотрю это тоже важное понятие в контейнерах??? А то в лекциях, преп. про них только вот что говорил:
И всё, далее ещё один непонятный пример, и след. тема. |
||||||||
|
|||||||||
| Void |
|
||||||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
У препода с грамматикой все в порядке? Контейнер - это один класс, но контейнеры бывают разные и реализуются разными классами.
Бредятина какая-то... Ты уверен, что списал пример правильно?
Я тоже. Похоже на расширение контейнеров при помощи стратегий, но все равно бред.
В стандартной библиотеке помимо перечисленных есть еще классы stack, queue, priority_queue и bitset. С т.з. C++ полноценными контейнерами они не являются, но, вообще говоря, контейнерами их назвать можно. И главное - контейнер и итератор в C++ - это концепции, которым может удовлетворять пользовательский класс, даже не будучи унаследованным от стандартных контейнеров (этого, кстати, вообще делать нельзя). Достаточно определить тип итератора и ряд функций и typedef'ов. Это сообщение отредактировал(а) Void - 15.1.2006, 00:42 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||||||
|
|||||||||
| Zero |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
Спасибо убедил...
Ну там где многоточие мож неуспел дописать, но начало вроде такое, хотя мож и чё-нить нетак... В тот момент когда списывал с доски, сидел как в тёмном лису, мог и не так списать. Void а если это один класс, то получается можно сказать: Что контейнер например - это запись состоящая из объектов, любых типов, переход к которым может осуещствляется с помощью итератора, так чтоли? |
||||
|
|||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Примерно так. Только слово "запись" лучше убрать, правильнее именно "объект".
Совсем необязательно. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
Void а тогда зачем вообще нужен итератор? К записи, или ладно уж уберём, скажем "МАССИВ", ведь к нему можно по индексам напрямую обратится...
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Zero
Ты так и не понял... Итератор - это абстракция, позволяющая одинаково работать с любыми последовательностями, грубо говоря, со всем, что можно перебрать поэлементно, будь то список, массив или еще более сложная структура данных. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
А-а-а... Тогда, понял, в книге как раз было написано, что итератор, это что-то типа указателя, на область ОП.
Следует так: Контейнер - это есть запись которая работает, с более "крутыми" объектами, а так как напрямую к ней нельзя обратится, то за место прямой ссылки используется итератор. Типа такого наверно??? |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Zero
Опять-таки необязательно. Обыкновенный указатель подпадает под понятие итератора в C++. Итератор std::vector вполне м/б реализован как указатель. И "крутость" объектов тут не при чем: цель итератора - скрыть не реализацию объектов, которые хранит контейнер, а реализацию самого контейнера. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
А я это подразумевал, что обычные массивы однотипные объекты хранят какбы, а контейнеры я так понимаю, разнотипные, причём запись наверно, это слабоуровневые разнотипные объекты, а контейнеры как я понял, могут хранить идентификаторы типа "Класс", причём любой. Ведь в этом приимущество контейнеров или нет, а то чё то я до конца не как не пойму. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Нет! По крайней мере в C++ (как в статически типизированном языке) контейнеры хранят объекты одного типа.
Добавлено @ 01:44 Преимущество контейнеров в том, что они: а) автоматически управляют выделением памяти для новых элементов. б) позволяют абстрагироваться от конкретного представления элементов. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Zero |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
А-а-а...
А это как понимать??? Добавлено @ 01:54 Ты имеешь ввиду скрыватся, под словом абстрогировать??? Т.е. внутреннюю реализацию, какой элемента за кем идёт нельзя смотреть через отладчик например? Это сообщение отредактировал(а) Zero - 15.1.2006, 01:51 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |