Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что такое "контейнеры классов", и для чего они предназначены? 
V
    Опции темы
Zero
Дата 14.1.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Сорри, за опять примитивный вопрос... Но я ща готовлюсь к экзаменам, и в лекциях, про них написано, что
Контейнеры ─ это множество классов, отличающихся типом исп. классов.
И там немного воды, потом про какието библиотечные контейнеры написано, с учётом, что мне ещё непонятно, что это вообще такое до конца. Короче препод вообще ужасные лекции составил...
А в книге по С++ при описании контейнеров, ссылка на 17 главу, где описано ещё много всякой всячены, к тому же про итераторы часто упомянается, а в вопросах к экзамену такого нет, так что если по книге тут можно ещё целый день, сидеть один вопрос учить. smile
Если кому не трудно, то напишите пожалуйста ещё ситуацию, где эти контейнеры могут применятся, и маленький примерчик, чтобы мне понять суть вопроса.
Заранее спасибо!!!
PM MAIL ICQ   Вверх
TIGERоX
Дата 14.1.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


начинающий...
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.9.2005

Репутация: нет
Всего: 1



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

 class my_class{
      ...
 };

 Stack<my_class> stack;//создаем объект-стек в котором можно будет хранить объекты my_class
 my_class *m1 = new my_class;
 stack.push(m1); //добавляем элемент в стек
 stack.pop(m1); //выталкиваем из стека


PM MAIL   Вверх
Daevaorn
Дата 14.1.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Zero
Контейнеры это хранилище некоторых данных. Стандартные контенеры С++ это std::vector, std::list, std::map, std::set и т.д. Это шаблонные классы. Для примера std::vector это простой линейный динамический массив. Применяется везде где нужны массивы. Упрощает работу с элементами: добавление, удаление, итерации по ним.

Код

void foo()
{
   std::vector< int > vec( 10 ); //массив из 10 элементов типа int. Суть тажа что и int* vec = new int[ 10 ];
   vec[ 4 ] = 777; // запись в пятый элемент
   vec.erase( vec.begin() + 4 ); // удалили элемент номер пять
   // т.д.
}

PM MAIL WWW   Вверх
Void
Дата 14.1.2006, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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 - то же самое, но допускает дубликаты.

Итераторы... Ох, тут начинаются терминологические и прочие дебри. Попытаюсь доступно объяснить:
Если у нас есть контейнер, то у нас должен быть способ обращаться к его элементам. Желательно не только обращаться, но и иметь возможность перебрать их все. Так вот: итератор - это объект, который позволяет это сделать. Итератор должен помнить, на какой объект он указывает, иметь возможность отдать этот объект коду, который его использует, перейти к следюущему объекту или уведомить клиентский код о невозможности такого перехода. Итератор (в общепринятом смысле этого слова) - это абстракция над любыми последовательностями. Так, например, код, который должен перебрать некоторые элементы, будет выглядеть одинаково для массива и связанного списка, если у них будет реализован интерфейс итератора.

Код
/* Это абстрактный и НЕ стандартный код! Использование стандартной библиотеки 
здесь приведет к применению шаблонов, что скроет саму суть понятия итератора за деталями. */

class Iterator {
    virtual bool has_next() const = 0;
    virtual void move_next() = 0;
    virtual SomeObject &get() const = 0;
};

class Sequence {
    virtual Iterator *get_iterator() const = 0;
};

class MyArray : public Sequence {
    class ArrayIterator : public Iterator { ... };
    Iterator *get_iterator() const { return new ArrayIterator(...); }
   // только не говорите мне про утечку памяти :) Это всего лишь абстрактный пример.
};

class MyList : public Sequence {
    class ListIterator : public Iterator { ... };
    Iterator *get_iterator() const { return new ListIterator(...); }
};

void printElements(Iterator i) {
    while (i.has_next()) {
        std::cout << i.get();
        i.move_next();
    }
}

Применительно к 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
PM MAIL WWW GTalk   Вверх
Zero
Дата 15.1.2006, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(Void @ 14.1.2006, 23:31 Найти цитируемый пост)

Контейнер - это класс, объекты которого

Void т.е. как я понял, контейнер это есть один класс???
А то препод нам дал такое определение:
Цитата

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

Ещё вот такой пример давал:
Код

template <class general, class details> class my;
public: conteiner<general>;
private: details
..........................

Я только не понял, чё он этим примером хотел показать. smile smile
Ведь судя по всему, у него имелось ввиду что Conteiner это класс-шаблон типа general... smile дальше уже пошла другая часть темы, про библиотечные контейнеры.
Весь прикол в том, что то что говоришь, ты похоже на то что написано в книге, правдо ассоциативные контейнеры я пока ненашёл smile ну а то что препод написал там как бы другие существуют конт-ры, или мож я не так понял чё? smile
PS: а иетратор, я смотрю это тоже важное понятие в контейнерах??? А то в лекциях, преп. про них только вот что говорил:
Цитата

Для работы с элементами контейнера, существует спец. переменная "итератор"

И всё, далее ещё один непонятный пример, и след. тема. smile
PM MAIL ICQ   Вверх
Void
Дата 15.1.2006, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Zero @ 15.1.2006, 02:31 Найти цитируемый пост)
Контейнер - это множество классов, отличающихся типами используемых классов.

У препода с грамматикой все в порядке? Контейнер - это один класс, но контейнеры бывают разные и реализуются разными классами.
Цитата(Zero @ 15.1.2006, 02:31 Найти цитируемый пост)
Ещё вот такой пример давал:

Бредятина какая-то... Ты уверен, что списал пример правильно?
Цитата(Zero @ 15.1.2006, 02:31 Найти цитируемый пост)
Я только не понял, чё он этим примером хотел показать.

Я тоже. Похоже на расширение контейнеров при помощи стратегий, но все равно бред.
Цитата(Zero @ 15.1.2006, 02:31 Найти цитируемый пост)
ну а то что препод написал там как бы другие существуют конт-ры

В стандартной библиотеке помимо перечисленных есть еще классы 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
PM MAIL WWW GTalk   Вверх
Zero
Дата 15.1.2006, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(Void @ 15.1.2006, 01:41 Найти цитируемый пост)

У препода с грамматикой все в порядке? Контейнер - это один класс,

Спасибо убедил... smile Тебе я больше доверяю.
Цитата(Void @ 15.1.2006, 01:41 Найти цитируемый пост)

Бредятина какая-то... Ты уверен, что списал пример правильно?

Ну там где многоточие мож неуспел дописать, но начало вроде такое, хотя мож и чё-нить нетак... В тот момент когда списывал с доски, сидел как в тёмном лису, мог и не так списать.
Void а если это один класс, то получается можно сказать:
Что контейнер например - это запись состоящая из объектов, любых типов, переход к которым может осуещствляется с помощью итератора, так чтоли? smile А элементы добавлятся, либо в конец либо в начало.
PM MAIL ICQ   Вверх
Void
Дата 15.1.2006, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Zero @ 15.1.2006, 02:53 Найти цитируемый пост)
Что контейнер например - это запись состоящая из объектов, любых типов, переход к которым может осуещствляется с помощью итератора, так чтоли?

Примерно так. Только слово "запись" лучше убрать, правильнее именно "объект".
Цитата(Zero @ 15.1.2006, 02:53 Найти цитируемый пост)
А элементы добавлятся, либо в конец либо в начало.

Совсем необязательно.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Zero
Дата 15.1.2006, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Void а тогда зачем вообще нужен итератор? К записи, или ладно уж уберём, скажем "МАССИВ", ведь к нему можно по индексам напрямую обратится... smile
PM MAIL ICQ   Вверх
Void
Дата 15.1.2006, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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
PM MAIL WWW GTalk   Вверх
Zero
Дата 15.1.2006, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



А-а-а... Тогда, понял, в книге как раз было написано, что итератор, это что-то типа указателя, на область ОП.

Следует так:
Контейнер - это есть запись которая работает, с более "крутыми" объектами, а так как напрямую к ней нельзя обратится, то за место прямой ссылки используется итератор. smile
Типа такого наверно??? smile
PM MAIL ICQ   Вверх
Void
Дата 15.1.2006, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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
PM MAIL WWW GTalk   Вверх
Zero
Дата 15.1.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(Void @ 15.1.2006, 02:33 Найти цитируемый пост)

И "крутость" объектов тут не при чем

А я это подразумевал, что обычные массивы однотипные объекты хранят какбы, а контейнеры я так понимаю, разнотипные, причём запись наверно, это слабоуровневые разнотипные объекты, а контейнеры как я понял, могут хранить идентификаторы типа "Класс", причём любой. Ведь в этом приимущество контейнеров или нет, а то чё то я до конца не как не пойму.
PM MAIL ICQ   Вверх
Void
Дата 15.1.2006, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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
PM MAIL WWW GTalk   Вверх
Zero
Дата 15.1.2006, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(Void @ 15.1.2006, 02:42 Найти цитируемый пост)

а) автоматически управляют выделением памяти для новых элементов.

А-а-а... smile Вот почему вектор называется контейнером. Я как раз его в своём курсаче испльзовал. Только, когда я готовил предыдущий вопрос "параметризированые классы(шаблоны)", я думал что вектор называется только шаблоном.
Цитата(Void @ 15.1.2006, 02:42 Найти цитируемый пост)

б) позволяют абстрагироваться от конкретного представления элементов.

А это как понимать??? smile
Добавлено @ 01:54
Ты имеешь ввиду скрыватся, под словом абстрогировать???
Т.е. внутреннюю реализацию, какой элемента за кем идёт нельзя смотреть через отладчик например? smile

Это сообщение отредактировал(а) Zero - 15.1.2006, 01:51
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1131 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.