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

итератор для контейнера - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
02.05.2013, 23:53     итератор для контейнера #1
Собственно, интересует такой вопрос: "Как создать собственный класс-итератор для контейнера?".
Контейнер построен по типу "очередь". Содержимое контейнера - это фигуры (производные классы от базового 'shapes').
Вообще очень мало информации я смог найти по поводу создания собственного контейнера и итератора для него, вот к примеру, шикарный паттерн для реализации собственного итератора:
Паттерн
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <iostream>
 
template <class node, class T>
class iterator
{
public:
 
    iterator(node* n)
    : node_ptr(n)
    {
    }
 
    T* operator * ()
    {
        return node_ptr->get();
    }
 
    T* operator -> ()
    {
        return node_ptr->get();
    }
 
    void operator ++ ()
    {
        node_ptr = node_ptr->next();
    }
 
    iterator operator ++ (int)
    {
        iterator iter(*this);
        ++(*this);
        return iter;
    }
 
    bool operator == (iterator const& i)
    {
        return node_ptr == i.node_ptr;
    }
 
    bool operator != (iterator const& i)
    {
        return !(*this == i);
    }
 
private:
 
    node* node_ptr;
};
 
template <class T>
class list_node
{
public:
 
    list_node(T const& t)
    : object(t)
    , next_node(0)
    {
        
    }
 
    ~list_node()
    {
        delete next_node;
    }
 
    void push_back(T const& t)
    {
        if(next_node)
        {
            next_node->push_back(t);
        }
        else
        {
            next_node = new list_node(t);
        }
    }
 
    list_node* next()
    {
        return next_node;
    }
 
    T* get()
    {
        return &object;
    }
 
private:
 
    T object;
    list_node* next_node;
};
 
template <class T>
class list
{
public:
 
    typedef list_node<T> node;
 
    typedef iterator<node, T> iterator;
 
    list()
    : root(0)
    {
    }
 
    ~list()
    {
        delete root;
    }
 
    void push_back(T const& t)
    {
        if(root)
        {
            root->push_back(t);
        }
        else
        {
            root = new node(t);
        }
    }
 
    iterator begin()
    {
        return iterator(root);
    }
 
    iterator end()
    {
        return iterator(0);
    }
 
private:
 
    node* root;
};
 
int main()
{
    typedef list<std::string> string_container;
    string_container orders;
 
    orders.push_back("First");
    orders.push_back("Second");
    orders.push_back("Third");
    orders.push_back("Fourth");
 
    for(string_container::iterator it = orders.begin(); it != orders.end(); ++it)
    {
        std::cout << it->c_str() << std::endl;
    }
 
    return 0;
}


Источник
Содрал с сайта: http://insidecpp.ru/patterns/iterator/


Но к сожалению он реализован на шаблонах, а я пока в них "плаваю" и поэтому ни как не могу подогнать этот итератор к своему контейнеру, может кто поможет реализовать его к моему контейнеру (мне стыдно, что сам сделать не могу, но деваться некуда), буду очень благодарен помощи.

Ниже описана реализация созданного мною контейнера:

header.h
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
class link
{
public:
    shapes* value;
    link* next;
 
    link();
    ~link();
};
 
class queue
{
protected:
    link* head; //указатель на начало очереди
    link* tail; //указатель на конец очереди
    link* cur; //вспомогательный указатель на текущий эл в очереди
    
public:
    void enqueue(shapes *s); //добавить элемент (в конец списка)
    void dequeue(); //удалить элемент (из начала списка)
    void printCont();   //вывод содержимого контейнера
 
    queue();
    ~queue();
};


impl.cpp
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
link::link()
{
    value=0;
    next=0;
};
 
link::~link()
{};
 
 
 
queue::queue()
{
    head=new link;
    tail=new link;
};
 
queue::~queue()
{};
 
void queue::enqueue(shapes* s) //добавить элемент (в конец списка)
{
    if (head->next==0) 
    {
        cur=new link; //используется однажды,
        head->next=cur; //когда добавляется 1-й элемент
    }
    else
    {
        cur->next=new link;
        cur=cur->next; //осуществляется сцепление элементов
    }
 
    cur->value=s;
    cur->next=cur; //излишне (но и не помешает) -- последний элемент указывает сам на себя
    tail->next=cur; //сохраняем адрес посл. эл. в контейнере
 
    cout<<"Добавлен элемент: ";
    cur->value->info();
    cout<<endl;
    
};
 
void queue::dequeue() //удалить элемент (из начала списка)
{
    link* dCur;
 
    dCur=head->next;
    if (dCur==0)
        cout<<"Контейнер пуст!"<<endl;
    else
    {
        if (dCur==dCur->next) //последний элемент, который будет удален
        {
            head->next=0;
            cout<<"Контейнер опустел."<<endl;
        }
        else //удаляется не последний элемент
            head->next=dCur->next;
 
        delete dCur;
    }
};
 
void queue::printCont() //вывести элементы
{
    link* pCur;
    if (head->next==0)
        cout<<"Контейнер пуст!"<<endl;
    else
    {
        pCur=head->next;
        while (pCur!=tail->next)
        {
            pCur->value->info();
            cout<<" ";
            pCur=pCur->next;
        }
 
        pCur->value->info(); //вывод последнего эл.
    }
};
]


P. S. При добавлении элемента, в процедуру передается указатель на объект фигуры, т.е.:
C++
1
2
3
4
5
6
queue obj;
shapes* p;
p=new square;
//p=new rhomb;
//p=new triangle;
obj.enqueue(p)
Вообщем говоря, использовать итератор в данной программе мне достаточно лишь для вывода содержимого контейнера и удаление последнего элемента в очереди.
Всем заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2013, 23:53     итератор для контейнера
Посмотрите здесь:

Итератор контейнера внутреннего класса шаблона C++
C++ необходимо в шаблонном классе, один из параметров которого контейнер, объявить итератор этого контейнера
Итератор для списка C++
Итератор для массива C++
Итератор для собственного контейнера C++
как сделать, чтобы итератор указывал на определенный элемент контейнера C++
C++ Итератор контейнера set
C++ STL итератор на конец контейнера

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
03.05.2013, 02:43     итератор для контейнера #2
http://habrahabr.ru/post/84184/
Yandex
Объявления
03.05.2013, 02:43     итератор для контейнера
Ответ Создать тему
Опции темы

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