Форум программистов, компьютерный форум CyberForum.ru

реализация итератора - C++

Восстановить пароль Регистрация
 
Анд_Рей
2 / 2 / 0
Регистрация: 27.12.2009
Сообщений: 145
18.09.2013, 00:54     реализация итератора #1
Реализация класса 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 цилк прекратится.
Как это справить ума не приложу!Помогите пожалуйса!
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 00:54     реализация итератора
Посмотрите здесь:

[C++] Разыменование итератора. C++
C++ Проверка итератора
Ошибка в объявлении итератора C++
Собственный класс итератора C++
C++ Удаление end() итератора
Достать строку из итератора C++
C++ Валидность итератора
Ошибка в объявлении итератора C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
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);
}
Yandex
Объявления
18.09.2013, 02:04     реализация итератора
Ответ Создать тему
Опции темы

Текущее время: 23:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru