Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/74: Рейтинг темы: голосов - 74, средняя оценка - 4.58
Заблокирован

Итераторы (пример использования итератора для шаблона, к примеру списка)

01.06.2013, 14:23. Показов 14158. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Форумчани, приведите пожалуйста пример использования итератора для шаблона, к примеру списка. Зараннее благодарен. И если не трудно, разъяснить что это такое и с чем его едят
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.06.2013, 14:23
Ответы с готовыми решениями:

Написание итератора для списка
Приветствую. Вот собственно реализация списка: #include "stdafx.h" #include <iostream> #include <cstring> using namespace...

Реализовать итераторы для списка
Нужно реализовать итераторы для списка вида: p++ постфиксный инкремент q-p q-это указатель,который стоит справа от p. то есть q-p...

Реализовать итераторы begin() и end() для списка
Есть список. и операции для него 1)разыменование 2)инкремент (префиксный и постфиксный) 3) == 4) != Для того,чтобы проверить...

20
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.06.2013, 16:08
Итератор - это указатель на элемент контейнера.
Нужен он для того, чтобы работать с элементами контейнера и алгоритмами обобщенно,
независимо от того, какой именно контейнер используется.

Дело в том, что разные контейнеры STL по-разному реализуют доступ к своим элементам.
У vector они расположены последовательно в памяти, у list они связаны через указатели и т.д.
А итератор маскирует эти различия за обобщенным фасадом указателя.
Благодаря итераторам, можно использовать один и тот же алгоритм для разных контейнеров,
не меняя при этом ни строчки кода. Простейший пример:
C++
1
2
3
4
for (container_t::iterator it = Con.begin(); it != Con.end(); ++it)
{
    // ...
}
Этот код последовательно проходит по элементам контейнера Con.
Его тип (container_t) может быть любым: вставьте сюда vector, list, set, map или
queue - код останется работоспособным. В этом основной смысл итераторов.
Тип container и, соответственно, объект Con, может быть любым STL-контейнером.
2
Заблокирован
01.06.2013, 16:51  [ТС]
Спасибо, а можно если не тяжело в кратце описать сам контейнер Con в слечае списка... Точнее как там устроить итератор
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.06.2013, 17:00
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <list>
 
int main()
{
    std::list<int> List;
 
    List.push_back(123);
    List.push_back(456);
    List.push_back(789);
 
    for (std::list<int>::iterator it = List.begin(); it != List.end(); ++it)
    {
        std::cout << *it << std::endl;
    }
 
    return 0;
}
>123
>456
>789
1
Заблокирован
01.06.2013, 17:04  [ТС]
Спасибо, я понял это...я имел ввиду что я буду разрабатывать свой шаблон, по типу листа...и как вот это там прикрутить
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.06.2013, 17:47
Цитата Сообщение от igor921 Посмотреть сообщение
я имел ввиду что я буду разрабатывать свой шаблон, по типу листа...и как вот это там прикрутить
А зачем ? Вы хотите использовать свой контейнер в стандартных алгоритмах STL ?
0
Заблокирован
02.06.2013, 12:46  [ТС]
Да, именно так нужно
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
02.06.2013, 13:09
Section 23.2 Container Requirements
Effective STL by Scott Meyers
The C++ Standard Library: A Tutorial and Reference by Nicolai Josutils
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.06.2013, 13:30
Если вкратце: Вам нужно определить свой класс итератора внутри своего класса-контейнера.
И в этом классе итератора (их будет несколько - iterator, const_iterator, reverse_iterator и
const_reverse_iterator) определить необходимые методы и typedef-ы. Как именно это делается -
зависит от особенностей работы контейнера. Пример реализации итератора можно найти в
книге "C++. Стандартная библиотека" (Н. Джосьютис). Не менее полезным будет заглянуть в
соответствующую главу Стандарта С++ про типы итераторов и требования к ним:
"C++ 2003 (ISO/IEC 14882, "24. Iterators Library").
2
Заблокирован
02.06.2013, 14:36  [ТС]
Спасибо за помощь, буду разбираться)
0
1 / 1 / 0
Регистрация: 02.05.2016
Сообщений: 12
18.09.2017, 12:29
Здравствуйте!
И у меня возникла подобная(обратная) задача. Я хочу использовать stl контейнер в собственной коллекции ( коллекция = итератор[GoF] + контейнер[stl, или самописный, и т.д.])
Для пояснения приведу рабочий код:
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#include <assert.h>
#include <iostream>
#include <string>
#include <stdexcept>
#include <list>
 
using namespace std;
 
template<class Item>
class Iterator {
public:
    virtual ~Iterator();
    virtual void First() = 0;
    virtual void Next() = 0;
    virtual bool IsDone() const = 0;
    virtual Item * CurrentItem() const = 0;
protected:
    Iterator();
};
 
template<class Item>
Iterator<Item>::Iterator() {
}
 
template<class Item>
Iterator<Item>::~Iterator() {
}
//------------------------------------------------------------------------------
 
struct A {
    A(string mark) :
            mMark(mark) {
    }
    string mMark;
};
 
//------------------------------------------------------------------------------
 
template<class T>
class IteratorList: public Iterator<T> {
    typename list<T>::iterator curr;
    typename list<T>::iterator first;
    typename list<T>::iterator last;
public:
    virtual ~IteratorList() {}
    IteratorList(typename list<T>::iterator c, typename list<T>::iterator f,
            typename list<T>::iterator l) :
                curr(c), first(f), last(l) {
    }
        
// Функция костыль: по сули дублирует код конструктора, но без нее не получатся связать итератор с контейнером внутри коллекции.   
    void  Init(typename list<T>::iterator c, typename list<T>::iterator f, typename list<T>::iterator l ) {
        curr = c;
        first = f;
        last = l;
    }
 
    // By GoF
    virtual void First();
    virtual void Next();
    virtual bool IsDone() const;
    virtual T* CurrentItem() const;
 
    // Стратуструп
    T& operator*() {
        return *curr;
    }
    const T& operator*() const {
        return *curr;
    }
    T* operator->() {
        return &(*curr);
    }
 
 
    IteratorList& operator++();
    IteratorList& operator--();
};
 
template<typename T>
class ContainerList {
public:
    ContainerList() {
    }
    void PushBack(T car) {
        Cares.push_back(car);
    }
 
    typename list<T>::iterator Begin() {
        return Cares.begin();
    }
 
    typename list<T>::iterator End() {
        return Cares.end();
    }
private:
    list<T> Cares;
};
 
template<typename T>
class CollectionList {
public:
    CollectionList() :
        containList(), itList(containList.Begin(), containList.Begin(), containList.End()) { // my пустой itList тоже инит. копиями пустых итераторов
        // идея связать containList и itList на этапе создания коллекции (заранее)
    }
    void Add(T item) {
        containList.PushBack(item);
    }
    T* Get() {
        return itList.CurrentItem();
    }
 
    void First() {
        itList.Init(containList.Begin(), containList.Begin(), containList.End()); // хотелось бы без этой строки 
        itList.First();
    }
 
    void Next() {
        itList.Next();
    }
 
    bool IsDone() {
        return itList.IsDone();
    }
 
private:
    ContainerList<T> containList;
    IteratorList<T> itList;
};
 
//------------------------------------------------------------------------------
 
int main() {
    try {
 
        A* a1 = new A("bmw");
        A* a2 = new A("honda");
        A* a3 = new A("mazda");
 
        CollectionList<A*> coll;
        coll.Add(a1);
        coll.Add(a2);
        coll.Add(a3);
 
        cout  << " collection : \n";
 
        for(coll.First(); !coll.IsDone(); coll.Next()){
            A *a = *coll.Get();
            cout << a->mMark << "\n";
        }
//       coll.Next(); //  assert error
 
    }
 
    catch (exception& e) {
        cerr << "exception: " << e.what() << endl;
    }
    catch (...) {
        cerr << "exception\n";
    }
}
 
//------------------------------------------------------------------------------
 
template<class T>
IteratorList<T>& IteratorList<T>::operator++() {
    ++curr;
    if (curr == last)
        assert(!"iterator past end of list");
    return *this;
}
 
template<class T>
IteratorList<T>& IteratorList<T>::operator--() {
    if (curr == first)
        assert(!"iterator before begin of list");
    --curr;
    return *this;
}
 
//------------------------------------------------------------------------------
 
template<class T>
void IteratorList<T>::First() {
    curr = first;
}
 
template<class T>
void IteratorList<T>::Next() {
 
    if (curr != last)
        ++curr;
    else
        assert(!"iterator past end of list");
}
 
template<class T>
bool IteratorList<T>::IsDone() const {
    return curr == last;
}
 
template<class T>
T* IteratorList<T>::CurrentItem() const {
    return &(*curr);
}
(на github https://github.com/kitworker/MyStdContainer.git )

Вопрос в следующем: Как в функции CollectionList::First() обойтись без метода Init()?

C++
1
2
3
4
    void CollectionList::First() {
        itList.Init(containList.Begin(), containList.Begin(), containList.End());
        itList.First();
    }
Пробовал передавать итераторы в конструктор контейнера параметры по ссылке:
C++
1
2
3
4
       IteratorList::IteratorList(typename list<T>::iterator & c, typename list<T>::iterator & f,
            typename list<T>::iterator & l) :
                curr(c), first(f), last(l) {
    }
Но в таком случае не удается инкрементировать/декрементировать итераторы curr, first, last.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
18.09.2017, 13:17
Цитата Сообщение от kitworker Посмотреть сообщение
Как в функции CollectionList::First() обойтись без метода Init()?
Чуть-чуть поправил твой код:
Кликните здесь для просмотра всего текста

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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#include <cassert>
#include <iostream>
#include <string>
#include <stdexcept>
#include <list>
 
using namespace std;
 
template<class Item>
class Iterator {
public:
    virtual ~Iterator();
    virtual void First() = 0;
    virtual void Next() = 0;
    virtual bool IsDone() const = 0;
    virtual Item * CurrentItem() const = 0;
protected:
    Iterator();
};
 
template<class Item>
Iterator<Item>::Iterator() {
}
 
template<class Item>
Iterator<Item>::~Iterator() {
}
//------------------------------------------------------------------------------
 
struct A {
    A(string mark) :
            mMark(mark) {
    }
    string mMark;
};
 
//------------------------------------------------------------------------------
template<typename T>
class ContainerList ;
 
template<class T>
class IteratorList: public Iterator<T> {
    ContainerList<T> & container;
    typename ContainerList<T>::iterator curr;
 
public:
    virtual ~IteratorList() {}
    IteratorList(ContainerList<T> & c)
        : container(c), curr(c.Begin())
    { }
 
    // By GoF
    virtual void First();
    virtual void Next();
    virtual bool IsDone() const;
    virtual T* CurrentItem() const;
 
    // Стратуструп
    T& operator*() {
        return *curr;
    }
    const T& operator*() const {
        return *curr;
    }
    T* operator->() {
        return &(*curr);
    }
 
 
    IteratorList& operator++();
    IteratorList& operator--();
};
 
template<typename T>
class ContainerList {
public:
    typedef typename list<T>::iterator iterator;
 
    ContainerList() {
    }
    void PushBack(T car) {
        Cares.push_back(car);
    }
 
    iterator Begin() {
        return Cares.begin();
    }
 
    iterator End() {
        return Cares.end();
    }
private:
    list<T> Cares;
};
 
template<typename T>
class CollectionList {
public:
    CollectionList() :
        containList(), itList(containList)
    {
    }
    void Add(T item) {
        containList.PushBack(item);
    }
    T* Get() {
        return itList.CurrentItem();
    }
 
    void First() {
        itList.First();
    }
 
    void Next() {
        itList.Next();
    }
 
    bool IsDone() {
        return itList.IsDone();
    }
 
private:
    ContainerList<T> containList;
    IteratorList<T> itList;
};
 
//------------------------------------------------------------------------------
 
int main() {
    try {
 
        A* a1 = new A("bmw");
        A* a2 = new A("honda");
        A* a3 = new A("mazda");
 
        CollectionList<A*> coll;
        coll.Add(a1);
        coll.Add(a2);
        coll.Add(a3);
 
        cout  << " collection : \n";
 
        for(coll.First(); !coll.IsDone(); coll.Next()){
            A *a = *coll.Get();
            cout << a->mMark << "\n";
        }
 
//       coll.Next(); //  assert error
 
    }
 
    catch (exception& e) {
        cerr << "exception: " << e.what() << endl;
    }
    catch (...) {
        cerr << "exception\n";
    }
}
 
//------------------------------------------------------------------------------
 
template<class T>
IteratorList<T>& IteratorList<T>::operator++() {
    assert(curr != container.End() && "iterator past end of list");
    ++curr;
    return *this;
}
 
template<class T>
IteratorList<T>& IteratorList<T>::operator--() {
    assert(curr != container.Begin() && "iterator before begin of list");
    --curr;
    return *this;
}
 
//------------------------------------------------------------------------------
 
template<class T>
void IteratorList<T>::First() {
    curr = container.Begin();
}
 
template<class T>
void IteratorList<T>::Next() {
 
    if (curr != container.End())
        ++curr;
    else
        assert(!"iterator past end of list");
}
 
template<class T>
bool IteratorList<T>::IsDone() const {
    return curr == container.End();
}
 
template<class T>
T* IteratorList<T>::CurrentItem() const {
    return &(*curr);
}
3
1 / 1 / 0
Регистрация: 02.05.2016
Сообщений: 12
18.09.2017, 13:46
Спасибо за быстрый ответ и красивое решение! =)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
18.09.2017, 13:50
kitworker, я там в одном месте еще забыл assert у тебя исправить. Хоть это и не относится к теме, но все же.
C++
1
2
3
4
5
template<class T>
void IteratorList<T>::Next() {
    assert(curr != container.End() && "iterator past end of list");
    ++curr;
}
Весь смысл ассертов в том, что это отладочный инструмент для программиста, чтобы помочь ему не нарушать контракты функций.
И в релизной сборке обычно их полностью отключают (есть специальный макро для этого NDEBUG).
А в твоем коде так не получилось бы. Проверки вынесены из ассерта в отдельные if`ы, которые никуда в релизе не денутся.
1
1 / 1 / 0
Регистрация: 02.05.2016
Сообщений: 12
18.09.2017, 13:56
Ага, спасибо, учту!
0
1 / 1 / 0
Регистрация: 02.05.2016
Сообщений: 12
19.09.2017, 17:28
Ну вот в первом приближении получилась шаблонная коллекция:

https://github.com/kitworker/MyStdContainer.git

Не совсем получилось сделать интерфейс для контейнера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename TData, template< typename _Tp, typename _Alloc = std::allocator<_Tp> > class TContain >
class IContainer {
public:
    virtual ~IContainer(){}
    typedef typename TContain<TData>::iterator iterator;
 
    virtual void PushBack(TData item)=0;
    virtual iterator Begin()=0;
    virtual iterator End()=0;
 
    IContainer(){}  // TODO не получается сделать приватным приватным, не понял почему?
private:
};

И еще видимо ради возможности использования stl контейнеров, придется в собственных контейнерах использовать это шаблон шаблонное выражение:
C++
1
template<typename TData, template< typename _Tp, typename _Alloc = std::allocator<_Tp> > class TContain >
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
19.09.2017, 22:53
Цитата Сообщение от kitworker Посмотреть сообщение
не получается сделать приватным приватным, не понял почему?
Ну ты же от него наследуешься. Наследнику нужен конструктор базового класса, чтобы сконструировать его подобъект. Можешь конструктор поместить в protected, тогда его будут иметь право звать только наследники.

Цитата Сообщение от kitworker Посмотреть сообщение
typename _Alloc = std::allocator<_Tp>
Параметр по умолчанию тут не обязателен (ибо он все равно проигнорируется).
Начинать имена с подчеркивания и заглавной буквы не стоит. Такие имена зарезервированы для нужд компилятора.
В этом случае вообще достаточно так написать:
C++
1
template<typename,  typename> class TContain
Однако, тут есть тонкость: количество шаблонных параметров у контейнеров не обязательно равно двум, см, например std::map. Поэтому эта идея видится мне неудачной. Я бы передавал контейнер сразу с типом (вроде ContainerStl<std::vector<int>>), заодно это даст возможность указать аллокатор или другие параметры контейнера, а твой вариант этой возможности лишен.
1
1 / 1 / 0
Регистрация: 02.05.2016
Сообщений: 12
20.09.2017, 13:17
Пока осмысли контейнер с двумя параметрами типа container<int, vector > :

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
// Компилируется 
 
#include <cstddef>
#include <iostream>
#include <list>
#include <vector>
//-#include <map>
//-#include <queue>
#include <stack>
 
using namespace std;
 
template< typename TData, template<typename, typename Alloc = allocator<TData> > class Contain >  //
class Container {
public:
    typedef typename Contain<TData>::iterator iterator;
    Container() :
        contain(), curr(begin()) {
    }
 
    void Append(const TData& t) {
        contain.push_back(t);
    }
 
    void First() {
        curr = begin();
    }
 
    void Next() {
        ++curr;
    }
 
    bool IsDone() {
        return curr == end();
    }
 
    TData * CurrentItem() {
        return &(*curr);
    }
 
private:
    iterator begin() {
        return contain.begin();
    }
    iterator end() {
        return contain.end();
    }
 
private:
    Contain<TData> contain;
    iterator  curr;
};
 
int main() {
    Container<int, list  > container;
 
    container.Append(9);
    container.Append(5);
 
 
    for(container.First(); !container.IsDone(); container.Next() ) {
        cout << *container.CurrentItem() << "\n";
    }
}
Добавлено через 7 минут
Пробовал вроде Сontainer< std::vector<int> >, но не разобрался как получить значение типа шаблон шаблонного параметра:

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
// Не компилируется. Не заня как добрать до значения параметра шаблона Tp
#include <cstddef>
#include <iostream>
#include <list>
#include <vector>
//-#include <map>
//-#include <queue>
#include <stack>
 
using namespace std;
 
 
template< template<typename Tp, typename Alloc = allocator<Tp> >    class Contain >  
class Container {
public:
    typedef typename Contain<Tp>::iterator iterator;
    Container() :
        contain(), curr(begin()) {
    }
 
    void Append(const Tp& t) {
        contain.push_back(t);
    }
 
    void First() {
        curr = begin();
    }
 
    void Next() {
        ++curr;
    }
 
    bool IsDone() {
        return curr == end();
    }
 
    Tp * CurrentItem() {
        return &(*curr);
    }
 
private:
    iterator begin() {
        return contain.begin();
    }
    iterator end() {
        return contain.end();
    }
 
private:
    Contain<Tp> contain;
    iterator  curr;
};
 
int main() {
    Container< list<int>  > container;
 
    container.Append(9);
    container.Append(10);
 
    for(container.First(); !container.IsDone(); container.Next() ) {
        cout << *container.CurrentItem() << "\n";
    }
}
Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
template<typename, *typename> class TContain
я понял это как то так:

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
// Не компилируется. Даже не представлю как реализовать функции добавления и возврата данных
#include <cstddef>
#include <iostream>
#include <list>
#include <vector>
//-#include <map>
//-#include <queue>
#include <stack>
 
using namespace std;
 
 
 
template< template<typename, typename>  class Contain >  
class Container {
public:
    typedef typename Contain::iterator iterator;
    Container() :
        contain(), curr(begin()) {
    }
 
//  void Append(const Tp& t) {
//      contain.push_back(t);
//  }
 
    void First() {
        curr = begin();
    }
 
    void Next() {
        ++curr;
    }
 
    bool IsDone() {
        return curr == end();
    }
 
//  Tp * CurrentItem() {
//      return &(*curr);
//  }
 
private:
    iterator begin() {
        return contain.begin();
    }
    iterator end() {
        return contain.end();
    }
 
private:
    Contain contain;
    iterator  curr;
};
 
int main() {
    Container< list<int>  > container;
 
//  container.Append(9);
//  container.Append(10);
 
    for(container.First(); !container.IsDone(); container.Next() ) {
//      cout << *container.CurrentItem() << "\n";
    }
}
Добавлено через 44 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Я бы передавал контейнер сразу с типом (вроде ContainerStl<std::vector<int>>)
Согласен с вами, только не знаю как это реализовать)
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 27
01.04.2020, 18:00
DrOffset, не могли б Вы объяснить Ваш код для начинающих?По-возможности расставить комментари.Очень прошу!
0
1 / 1 / 0
Регистрация: 02.05.2016
Сообщений: 12
01.04.2020, 19:47
Рекомендую вам посмотреть на тему итераторов
https://www.google.com/url?sa=... iaMg-LUvJ9

Добавлено через 24 минуты
И ещё видео по на тему "универсальной" коллекции для стандартных контейнеров: https://fr.coursera.org/lectur... iiei-p0EYh
Курс кстати очень достойный, настоятельно рекомендую
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.04.2020, 19:47
Помогаю со студенческими работами здесь

Пример использования MSComm для считывания данных
Нужен пример использования MSComm для считывания данных (текст) с com-порта и занесения их в базу (mdb) или текст-файл. Заранее...

пример использования MODI для отображения документа на экране
Господа, поделитесь, пожалуйста, примером использования MODI для отображения документа на экране. Заранее премного благодарен!

Нужен пример использования OpenCL для параллельных вычислений
Здравствуйте уважаемые господа программисты. Кто нибудь когда нибудь использовал для параллельных вычислений библиотеку opencl? мне нужен...

Пример использования потоков для вывода данных в форму
Понимаю что в инете достаточно информации по потокам, но мне трудно разобраться по ним... намного проще разобраться по примеру...

Рамка по примеру(Без использования CSS)
Как сделать такое оформление рамки, без использования CSS:


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru