Шаг 26 - Как сделать массив из чего угодно. Продолжение 2.
Шаг 26 - Как сделать массив из чего угодно. Продолжение 2.
Итераторы.
В Шагах 15 и 16 мы повозились с имитацией массива (коллекцией). Мы добились нормальной работы при чтении и записи в ячейки массива. Но работа с массивом этим не ограничивается. Вот захочется нам сделать что-то со всеми элементами массива, а он индексирован по строке.
// Бред
for (string cCounter= "a"; a ‹ "zzzz"; a++) array.[cCounter].doit();
Нет, это неправильно. Нужно сделать так, чтобы коллекция сама себя перебирала.
CIndex index = array.getStart();
while (!array.eof()) {
index = array.getIndex ();
array[index].doIt();
array.getNext();
};
Ну вот, на что-то похоже. Появился некий элемент index класса CIndex, без которого в принципе можно обойтись, если коллекция будет хранить текущее значение перебора внутри себя. Но вот беда - если вдруг коллекцию захотят перебрать разные клиенты? Ну глобальная она, существует вместе с программой, а обращаются к ней разные объекты, как себя перебрать бедной коллекции? В общем, подход тут такой же, как и в жизни: тебе надо, ты и шевелись, в смысле перебирай. Упомянутый выше index тут как нельзя кстати. Называем его Зингельшухером… (oops!) Простите - итератором, объявляем его дружественным коллекции, прописываем в него текущую позицию, пишем скромный набор функций навигации типа goFirst, goNext, isLast. В зависимости от того, где мы их пишем, итератор будет или активным - если функции навигации в нем, или пассивным - если они лежат в коллекции.
Итак, что делаем: в шаблон ampstack‹Type› из Шага 23 вписываем дружбу к классу итератора:
friend class ampIter;
и сам шаблон класса итератора:
// Класс итератора, дружественный нашему стеку.
template ‹class Type›
class ampIter {
private:
ampstack‹Type›* m_stack;
int iPosition;
public:
ampIter(ampstack‹Type›* _as = NULL) : m_stack(_as), iPosition (0) {}
int isLast(void) { return iPosition + 1 - m_stack-›iTop; }
void moveStart(void) {iPosition = 0; }
Type* moveNext(void) { return m_stack-›array[iPosition++]; }
};
Итераторы - это тема, граничащая с безумием. Мы вовремя остановились на активном итераторе, шаблоне, не вложенном, с семантикой указателей. А ведь их можно вкладывать (т.е. объявлять класс итератора внутри класса коллекции), связывать с курсорами, перегружать их операторы, изменять семантику, вводить многопоточность, создавать внутри (!) итератора мгновенную частную копию коллекции и это только начало. По счастью, о нас уже позаботился Алексей Степанов, и подарил нам Библиотеку Стандартных Шаблонов - Standart Template Library, полную итераторов, равно коллекций и алгоритмов. Немного о них можно почитать на этом же сайте в разделе VC++-›STL у Артема Каева, а много - в MSDN.
Так же добавлю, что пользуюсь при подготовке Шагов компилятором BC3.1, а он поддерживает шаблоны не вполне так, как это делают современные компиляторы. То есть, если Вы просто скопируете код, вероятно он сразу даже не откомпилируется. Так что предупреждаю - если собираетесь пользоваться шаблонами - проверьте, что на эту тему думает компилятор (а так же насчет исключений и операторов вида xxxxxxx_cast‹›()).
Мне же итератор нужен был исключительно для следующих Шагов, а совпадения фамилий, характеров и событий прошу считать случайными.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Заблуждение № 1: хороший продавец может продать товар кому угодно
Заблуждение № 1: хороший продавец может продать товар кому угодно Неправда! Тот, кто так говорит, просто испытывает вас. Не попадайтесь на его удочку. На сайте нашей компании есть слова «Помощь в увеличении конверсии: как убедить посетителя сделать следующий шаг». Очень
Заблуждение № 4: если правильно организовать торговлю, можно продать все что угодно
Заблуждение № 4: если правильно организовать торговлю, можно продать все что угодно Неправда! Если товар не имеет ценности для покупателя, или вы стараетесь решить проблему, которая никого не волнует, или ваш сервис хромает, или цены выше всяких разумных пределов. или
Прямоугольный массив
Прямоугольный массив Для создания прямоугольного массива установите переключатель в окне Array (Массив) в положение Rectangular Array (Прямоугольный массив). При этом станут доступны следующие параметры.• Для изменения количества строк и столбцов используют поля Rows (Строки) и
Трехмерный массив
Трехмерный массив Для создания трехмерного массива используется команда 3DARRAY. Как и на плоскости, в трехмерном пространстве можно создать два типа массива – прямоугольный и круговой. Только при формировании прямоугольного массива в качестве дополнительного параметра
Круговой массив
Круговой массив Для того чтобы создать круговой трехмерный массив, нажмите кнопку 3D Array (Трехмерный массив) в группе Modify (Редактирование) на вкладке Ноте (Основная) ленты или выполните команду Modify ? 3D Operations ? 3D Array (Редактирование ? Трехмерные операции ? Трехмерный
Шаг 15 - Как сделать массив из чего угодно.
Шаг 15 - Как сделать массив из чего угодно. Массивы и оператор operator[]. Давайте попробуем придумать класс, объекты которого вели бы себя как массивы? Поехали. Решим, что класс внутри себя должен иметь для простоты массив, ну там счетчик элементов… вроде больше нечему там быть.
Прямоугольный массив
Прямоугольный массив Для создания прямоугольного массива установите переключатель в окне Array (Массив) в положение Rectangular Array (Прямоугольный массив) (см. рис. 6.7). При этом станут доступны следующие параметры.• Для изменения количества строк и столбцов используют поля Rows
Полярный массив
Полярный массив Для создания полярного массива установите переключатель в окне Array (Массив) в положение Polar Array (Полярный массив) (рис. 6.11). Рис. 6.11. Окно создания полярного массиваПри этом становятся доступны следующие параметры.• Поля X и Y служат для указания центра
Трехмерный массив
Трехмерный массив Для создания трехмерного массива используется команда 3DARRAY. Как и на плоскости, в трехмерном пространстве можно создать два типа массива – прямоугольный и круговой. Только при формировании прямоугольного массива в качестве дополнительного параметра
Прямоугольный массив
Прямоугольный массив В трехмерном пространстве, кроме строк и столбцов, в прямоугольном массиве добавляются еще и уровни.Чтобы создать трехмерный прямоугольный массив, нажмите кнопку 3D Array (Трехмерный массив) на вкладке Home (Основная) в группе Modify (Редактирование) ленты
Круговой массив
Круговой массив Чтобы создать круговой трехмерный массив, нажмите кнопку 3D Array (Трехмерный массив) на вкладке Home (Основная) в группе Modify (Редактирование) ленты или выполните команду Modify ? 3D Operations ? 3D Array (Редактирование ? Трехмерные операции ? Трехмерный массив).Пример
Упортативь это: Самые полезные программы — те, которые работают где угодно, как угодно и не мусорят
Упортативь это: Самые полезные программы — те, которые работают где угодно, как угодно и не мусорят Автор: Серж СкаутПродолжим начатый в прошлой колонке рассказ о парадигме «карманного рабочего места», реализованной во «флэш-ключике» n-Key Flash Pro от компании n-Trance (biz). Сам по