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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Анд_Рей
3 / 4 / 0
Регистрация: 27.12.2009
Сообщений: 162
#1

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

18.09.2013, 00:54. Просмотров 959. Ответов 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 цилк прекратится.
Как это справить ума не приложу!Помогите пожалуйса!
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 00:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос реализация итератора (C++):

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

Реализация Map итератора - C++
Можно ли показать реализацию и применение простейшего итератора для данного контейнера, который я создал? #include&lt;iostream&gt; ...

Валидность итератора - C++
Допустимо ли делать такие проверки? Код то отрабатывает, но можно ли так делать? std::vector&lt;int&gt; vec = {1, 2, 3, 4, 5}; auto it =...

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

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

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

1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

Класс контейнера и итератора - C++
Товарищи программисты. Помогите выяснить что должен делать в данной задаче итератор. Реализовать шаблон класса vector, реализующий...

Отличие итератора от foreach - C++
Есть ли разница между циклами? std::vector&lt;int&gt; vec; vec.push_back(4); vec.push_back(5); vec.push_back(6); for...

Возврат итератора из функции - C++
в чем заключается проблема с возвратом итератора и как ее исправить? заранее спасибо за ответ =) (ожидаемый от программы ответ &quot;Yes&quot;,...

Удаление end() итератора - C++
Добрый вечер. Интересует следующий момент: что происходит в памяти (структуре контейнера) при вызове cont.erase(cont.end())? Если cont...


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

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

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