Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Анд_Рей
3 / 4 / 1
Регистрация: 27.12.2009
Сообщений: 173
#1

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

18.09.2013, 00:54. Просмотров 1468. Ответов 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 цилк прекратится.
Как это справить ума не приложу!Помогите пожалуйса!
Спасибо!

http://www.cyberforum.ru/cpp-beginners/thread1535539.html

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 00:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос реализация итератора (C++):

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

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

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

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

Инкремент невалидного итератора
Привет. Этот вопрос задали знакомому на собеседовании... Что произойдет...

1
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 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);
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2013, 02:04
Привет! Вот еще темы с решениями:

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

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

Класс контейнера и итератора
Товарищи программисты. Помогите выяснить что должен делать в данной задаче...

Достать строку из итератора
имеется map&lt;string, vector&lt;string&gt; &gt; container; for (map&lt;string,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru