![]() |
Модераторы: 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 |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |