Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/75: Рейтинг темы: голосов - 75, средняя оценка - 4.61
3 / 4 / 1
Регистрация: 27.12.2009
Сообщений: 183
1

реализация итератора

18.09.2013, 00:54. Показов 15188. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Реализация класса List и его итератора:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef LIST_H
#define LIST_H
 
#include<iostream>
 
template<class T>
class List
{
private:
    struct Node
    {
        T data;
        Node *next;
    };
    Node *head;
    Node *last;
 
    int length;
public:
    class Iterator
    {
    private:
        Node *head;
    public:
        Iterator(Node *head) { this->head = head; }
        Iterator operator++(int) { Iterator itr = *this; head = head->next; return itr; }
        T& operator*() { return head->data; }
        bool operator==(const Iterator &itr) { return head->data == itr.head->data; }
        bool operator!=(const Iterator &itr) { return head->data != itr.head->data; }
    };
 
    List()
    {
        head   = NULL;
        length = 0;
    }
 
    Iterator begin() const { return Iterator(head); }
    Iterator end() const { return Iterator(last); }
 
    void push(const T &data);
 
    void push_end(const T &data);
 
    T pop();
 
    void print();
 
    int size();
 
};
 
#endif
А вот пример с ошибкой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<string>
#include"List.h"
 
 
void main()
{
    List<std::string> list;
    
    list.push("World");
    list.push("Hello");
 
    for(List<std::string>::Iterator i = list.begin(); i!=list.end(); i++) //"World" не выводится
    {
        std::cout << *i << " ";
    }
    std::cout << std::endl;
 
    getchar();
}
В итераторе класса List содержится логическая ошибка:последний элемент списка НЕ выводится на экран!
Логически я понимаю в чем проблема:когда выражение метод интератора
C++
1
bool operator!=(const Intetator &itr) { return head->data != itr->data; }
вернет false цилк прекратится.
Как это справить ума не приложу!Помогите пожалуйса!
Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2013, 00:54
Ответы с готовыми решениями:

Упрощенная реализация итератора
- Доброго дня завсегдатаи ! Видел на Вашем форуме упрошенную реализацию контейнера std::vector. ...

Реализация Map итератора
Можно ли показать реализацию и применение простейшего итератора для данного контейнера, который я...

Реализация итератора для шаблонного класса
Изучаю С++. Решил реализовать свой вариант контейнера vector. Класс решил сделать шаблонным. Чтобы...

Разыменование итератора
Делаю предикат-функцию поиска внутри вектора,состоящего из экземпляров класса.Решил использовать...

1
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
18.09.2013, 02:04 2
Анд_Рей, насколько я понял, тут итератор end() указывает на последний элемент списка, хотя должен - на "мифический" следующий за последним. В operator == можно сравнивать указатели на Node, они ведь все уникальные. В end() возвращать Iterator(0).

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
bool operator ==(Iterator const rhs) const {
   return head == rhs.head;
}
 
bool operator !=(Iterator const rhs) const {
   return !(*this == rhs);
}
1
18.09.2013, 02:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2013, 02:04
Помогаю со студенческими работами здесь

Проверка итератора
как проверить указывает ли на что либо итератор или он уже неправильный?

Валидность итератора
Допустимо ли делать такие проверки? Код то отрабатывает, но можно ли так делать? ...

Ошибка в классе итератора
В общем, решил я написать для своего класса, реализующего двунаправленный список, написать...

Получение void* с итератора
собственно как вытащить адресс void* Добавлено через 22 секунды контейнер вектор

Удаление end() итератора
Добрый вечер. Интересует следующий момент: что происходит в памяти (структуре контейнера) при...

Возврат итератора из функции
в чем заключается проблема с возвратом итератора и как ее исправить? заранее спасибо за ответ =) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru