Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/10: Рейтинг темы: голосов - 10, средняя оценка - 4.60
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
1

Итератор для контейнера

02.05.2013, 23:53. Просмотров 1893. Ответов 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)
Вообщем говоря, использовать итератор в данной программе мне достаточно лишь для вывода содержимого контейнера и удаление последнего элемента в очереди.
Всем заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2013, 23:53
Ответы с готовыми решениями:

Итератор для собственного контейнера
понимаю, что уже создан миллион подобных тем, НО я не вьехал в них. мне...

Итератор контейнера set
Здравствуйте! Каким образом можно изменить значение итератора set на n (кроме...

STL итератор на конец контейнера
Подскажите пожалуйста у меня задача сделать дерево и слизать интерфейс с STL...

Итератор контейнера внутреннего класса шаблона
Следующий код компилируется: struct A { struct B {}; vector&lt;B&gt; vec;...

Вывод контейнера указателей через потоковый итератор
Доброго дня всем. Собственно: std::list&lt;int*&gt; list; list.push_back(new...

1
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
03.05.2013, 02:43 2
http://habrahabr.ru/post/84184/
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2013, 02:43

Как сделать, чтобы итератор указывал на определенный элемент контейнера?
как сделать, чтобы итератор указывал на, допустим, пятый элемент контейнера...

В шаблонном классе, один из параметров которого контейнер, объявить итератор этого контейнера
Собсно #include &lt;windows.h&gt; #include &lt;iterator&gt; #include &lt;vector&gt; using...

Реализовать двусвязный список (list), итератор (iterator) и константный итератор (сonst_iterator) для списка
не могу понять что должно быть результатом. может подскажете примеры?...


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

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

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