Чтение онлайн

на главную

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

6. Что представляют собой итераторы?

Это обобщенные указатели. Итератор можно инкрементировать, чтобы он указывал на следующий узел в последовательности. К нему также можно применить операцию разыменования, чтобы возвратить узел, на который он указывает.

7. Что такое объект функции?

Это экземпляр класса, в котором определен перегруженный оператор вызова функции . Объект функции можно также использовать как обычную функцию.

Упражнения 

1.

Создайте шаблон на основе данного класса List:

class List

{

public:

List:head(0),tail(0), tbeCount(0) { }

virtual ~List;

void insert( int value );

void append( int value );

int is_present( int value ) const;

int is_empty const { return head == 0: }

int count const { return theCount; }

private:

class ListCell

{

public:

ListCell(int value, ListCell *cell = ):val(value),next(cell){ }

int val;

ListCell *next;

};

ListCell *head;

ListCell *tail;

int theCount;

};

Вот один из способов выполнения этого шаблона:

template <class Type>

class List

{

public:

List:head(0),tail(0),theCount(0) { }

virtual ~List;

void insert( Type value );

void append( Type value );

int is_present( Type value ) const;

int is_empty const { return head == 0; }

int count const { return theCount; }

private:

class ListCell

{

public:

ListCell(Type value, ListCell *cell = O):val(value),next(cell) { }

Type val;

ListCell *next;

};

ListCell *head;

ListCell *tail;

int theCount;

};

2. Напишите выполнение обычной (не шаблонной) версии класса List.

void List::insert(int value)

{

ListCell *pt = new ListCell( value, head );

assert (pt ! = 0);

// эта строка добавляется для обработки хвостового узла

if ( head -= 0 ) tail = pt,

head = pt;

theCount++;

}

void List::append( int value )

{

ListCell *pt = new ListCell( value );

if ( head — 0 )

head = pt;

else

tail->next = pt:

tail = pt;

theCount++;

}

int List::is_present( int value ) const

{

if ( head == 0 )

return 0;

if ( head->val — value || tail->val == value )

return 1;

ListCell *pt = head->next;

for (; pt != tail; pt = pt->next)

if ( pt->val == value )

return 1;

return 0;

}

3. Напишите шаблонный вариант выполнения.

template <class Type>

List<Type>::~List

{

ListCell *pt = head;

while ( pt )

{

ListCell *tmp = pt;

pt = pt->next;

delete tmp;

}

head = tail = 0;

}

template <class Type>

void List<Type>::insert(Type value)

{

ListCell *pt = new ListCell( value, head );

assert (pt ! = 0);

// эта строка добавляется для обработки хвостового узла

if ( head == 0 )

tail = pt;

head = pt;

theCount++;

}

template <class Type>

void List<Type>::append( Type value )

{

ListCell *pt = new ListCell( value );

if ( head == 0 )

head = pt;

else

tail->next = pt;

tail = pt;

theCount++;

}

template <class Type>

int List<Type>::is_present( Type value ) const

{

if ( head == 0 )

return 0;

if ( head->val == value || tail->val == value )

return 1;

ListCell *pt = head->next;

for (; pt != tail; pt = pt->next)

if ( pt->val — value )

return 1;

return 0;

}

4. Объявите три списка объектов: типа Strings, типа Cat и типа int.

List<String> string_list;

List<Cat> Cat_List;

List<int> int_List;

5. Жучки: что неправильно в приведенном ниже программном коде? (Предположите, что определяется шаблон класса List, а Cat — это класс, определенный выше в данной книге.)

List<Cat> Cat_List;

Cat Felix;

CatList.append( Felix );

cout << "Felix is " << ( Cat_List.is_present( Felix ) ) ? "" : "not " << "present\n";

ПОДСКАЗКА (поскольку задание не из самых легких): подумайте, чем тип Cat отличается от типа int.

В классе Cat не определен оператор operator==. Все операции, в которых сравниваются значения членов класса iist, таких как is_present, будут вызывать ошибку компиляции. Для уменьшения вероятности возникновения таких ошибок перед объявлением шаблона поместите обширный комментарий, в котором должно быть указано, какие операторы следует определить в классе для успешного выполнения всех его методов.

Поделиться:
Популярные книги

Имперец. Земли Итреи

Игнатов Михаил Павлович
11. Путь
Фантастика:
героическая фантастика
боевая фантастика
5.25
рейтинг книги
Имперец. Земли Итреи

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Возвышение Меркурия. Книга 12

Кронос Александр
12. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 12

Ротмистр Гордеев 2

Дашко Дмитрий
2. Ротмистр Гордеев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ротмистр Гордеев 2

Шериф

Астахов Евгений Евгеньевич
2. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.25
рейтинг книги
Шериф

Магия чистых душ 3

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Магия чистых душ 3

Идеальный мир для Социопата 7

Сапфир Олег
7. Социопат
Фантастика:
боевая фантастика
6.22
рейтинг книги
Идеальный мир для Социопата 7

Совок-8

Агарев Вадим
8. Совок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Совок-8

Мастер Разума II

Кронос Александр
2. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
Мастер Разума II

Краш-тест для майора

Рам Янка
3. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
эро литература
6.25
рейтинг книги
Краш-тест для майора

Идеальный мир для Социопата 6

Сапфир Олег
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Идеальный мир для Социопата 6

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Внешники

Кожевников Павел
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Внешники

Никто и звать никак

Ром Полина
Фантастика:
фэнтези
7.18
рейтинг книги
Никто и звать никак