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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
#1

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

02.05.2013, 23:53. Просмотров 1582. Ответов 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++
понимаю, что уже создан миллион подобных тем, НО я не вьехал в них. мне необходимо реализовать собственный контейнер для использования...

Итератор контейнера set - C++
Здравствуйте! Каким образом можно изменить значение итератора set на n (кроме вызова ++ n раз). Можно ли преобразовать итератор одного типа...

STL итератор на конец контейнера - C++
Подскажите пожалуйста у меня задача сделать дерево и слизать интерфейс с STL std::map. Вопрос в следующем: когда мы обходим map итератором...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
03.05.2013, 02:43 #2
http://habrahabr.ru/post/84184/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2013, 02:43
Привет! Вот еще темы с ответами:

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

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

Итератор для списка - C++
#include &lt;iostream&gt; using namespace std; template &lt;class T&gt; class Link { public: T value; Link *nextLink; Link( T v,...

Итератор для вектора - C++
Привет, столкнулся с тем что при использовании stl вектора понадобился итератор перехода на элемент через индекс. не могли бы вы привести...


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

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

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