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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ можно ли сравнить все элементы одномерного массива с определенным значением посредством одной операции? http://www.cyberforum.ru/cpp-beginners/thread854544.html
можно ли сравнить все элементы одномерного массива с определенным значением посредством одной операции?
C++ Builder Извлечь иконку с ехе-шника по-моему все перепутал =) подскажите пож, как правильно ... HMODULE hLib; void __fastcall TForm1::FormCreate(TObject *Sender) { hLib = LoadLibrary(TEXT("shell32.dll")); } void __fastcall TForm1::Button1Click(TObject *Sender) http://www.cyberforum.ru/cpp-beginners/thread854540.html
Работа с файлами. Считывание информации из файла в массив C++
#include<conio.h> #include<stdio.h> struct add { char predmet; int klass; int kolvo; float cena; }; size_t count_lines(const char* filename) {
Классы. Вывод на экран номеров рейсов(NUMR) и типов самолетов, вылетающих в пункт назначения(NAZN), название которого совпало с названием, введенным C++
#include "stdafx.h" #include <iostream> #include "locale.h" #include "string.h" using namespace std; // ограничивает пространство переменных функций и т.д. class AEROFLOT { char NAZN; float COST; // компоненты класса типа доступа private объекториентирпрог int NUMR; char TIP;
C++ Посоветуйте статьи или книги где есть примеры собственных контейнеров http://www.cyberforum.ru/cpp-beginners/thread854503.html
Интересуют именно те реализации в которых есть базовый класс контейнер и есть производный класс контейнер, обязательно чтобы была шаблонная реализация. Пример: Бинарное дерево поиска - шаблонный класс BinaryTree (В нём хранится корень этого дерева, который типа NodeBinaryTree) Сбалансированное бинарное дерево поиска - шаблонный класс BinaryBalanceTree, который наследует BinaryTree (В нём...
C++ Преобразование DWORD в string DWORD to string как сделать, гугл не помог) если что консоль visual studio c++ подробнее

Показать сообщение отдельно
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
02.05.2013, 23:53     итератор для контейнера
Собственно, интересует такой вопрос: "Как создать собственный класс-итератор для контейнера?".
Контейнер построен по типу "очередь". Содержимое контейнера - это фигуры (производные классы от базового '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)
Вообщем говоря, использовать итератор в данной программе мне достаточно лишь для вывода содержимого контейнера и удаление последнего элемента в очереди.
Всем заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru