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

Свой итератор

30.07.2021, 23:15. Показов 1783. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include <iostream>
#include <list>
#include <vector>
#include <iterator> 
#include <algorithm>
using namespace std;
 
template<typename T>
class my_vector
{
public:
 
    my_vector(size_t size = 0):mas(nullptr), size(size)// конструктор
    {
        if (size > 0)
        {
            mas = new T[size];
        }
    }
    my_vector(initializer_list<T> lst):size(lst.size()) // инициал. с помощью init.._list
    {
        mas = new T[size];
        copy(lst.begin(), lst.end(), mas);
    }
    T& operator[](int n)// перегрузка [] для класса 
    {
        return mas[n];
    }
 
 
    ~my_vector()// деструктор
    {
        if (mas != nullptr)
        {
            delete[] mas;
        }
    }
    /////// !!! iterators here !!! ////////////
    template<bool isConst>
    struct my_common_iterator
    {
    private:
        conditional_t<isConst, const T*, T*> my_pointer;// метафункция. если isConst = true, то возвращает const T* иначе T*
    public:
        my_common_iterator(conditional_t<isConst, const T*, T*> ptr) :my_pointer(ptr) {}
        conditional_t<isConst, const T, T>& operator*()// перегрузки различных операторов для итераторов
        {
            return *my_pointer;
        }
        my_common_iterator& operator--()
        {
            my_pointer--;
            return *this;
        }
        my_common_iterator& operator--(int)
        {
            my_pointer--;
            return *this;
        }
        my_common_iterator& operator++(int)
        {
            my_pointer++;
            return *this;
        }
        my_common_iterator& operator++()
        {
            my_pointer++;
            return *this;
        }
    };
 
    using my_iterator = my_common_iterator<false>;
    using my_citerator = my_common_iterator<true>;
    my_iterator begin() const
    {
        return my_iterator(mas);
    }
    my_iterator end() const
    {
        return my_iterator(mas+size);
    }
    my_citerator begin() const
    {
        return my_citerator(mas);
    }
    my_citerator end() const
    {
        return my_citerator(mas + size);
    }
private:
    T* mas;
    size_t size;
};
int main()
{
    int* m = new int[5];
    my_vector<int> my_v = { 2,3,4,5,6 };
    my_vector<int>::my_iterator mitbn = my_v.begin();
    my_vector<int>::my_iterator miten = my_v.end();
    my_vector<int>::my_citerator mitb = my_v.begin();
    my_vector<int>::my_citerator mite = my_v.end();
    //*mitb = 1234;
    //*mite = 1234;
    cout << *mitb << " " << *(mite--) << endl;
    copy(itb, ite, m);
    for (int i = 0; i < 5; i++)
    {
        cout << m[i]<< endl;
    }
 
    return 0;
}
Собственно проблема: my_v.begin() и my_v.end() должны возвращать в определенных ситуациях то тип my_common_iterator<false>, то my_common_iterator<true>, но я не могу реализовать адекватно специализацию шаблонов, так что прошу вас помочь. я не хочу сейчас наследовать свой вектор от std::iterator, желаю сам написать итераторы. помогите....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.07.2021, 23:15
Ответы с готовыми решениями:

Свой однонаправленный итератор
Пытаюсь написать свой итератор и никак не могу придумать как писать операторы == и !=. Подскажите пожалуйста. template &lt;class...

Свой итератор для своего шаблона
Доброго дня всем. Долго разбираюсь, никак не разберусь. Написал свой шаблонный класс. Написал к нему итератор(тоже шаблон). Пытаюсь...

Свой итератор в стиле STL для контейнера
Здарово други! Пилю свой велосипед для работы с utf-8 и стал вопрос об создании своего итератора для контейнера да так, что бы работал с...

9
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.07.2021, 12:22
zag2pay, пометил знаком "!!!" исправленные места, разбирайтесь.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <list>
#include <vector>
#include <iterator> 
#include <algorithm>
using namespace std;
 
template<typename T>
class my_vector
{
public:
 
    my_vector(size_t size = 0):mas(nullptr), size(size)// конструктор
    {
        if (size > 0)
        {
            mas = new T[size];
        }
    }
    my_vector(initializer_list<T> lst):size(lst.size()) // инициал. с помощью init.._list
    {
        mas = new T[size];
        copy(lst.begin(), lst.end(), mas);
    }
    T& operator[](int n)// перегрузка [] для класса 
    {
        return mas[n];
    }
    T const & operator[](int n) const
    {
        return mas[n];
    } 
 
    ~my_vector()// деструктор
    {
        delete[] mas;
    }
    /////// !!! iterators here !!! ////////////
    template<bool isConst>
    struct my_common_iterator
    {
        friend struct my_common_iterator<true>; // !!!
    private:
        conditional_t<isConst, const T*, T*> my_pointer;// метафункция. если isConst = true, то возвращает const T* иначе T*
    public:
        my_common_iterator(conditional_t<isConst, const T*, T*> ptr) 
            : my_pointer(ptr) 
        { }
        my_common_iterator(my_common_iterator<false> const & other) // !!!
            : my_pointer(other.my_pointer) 
        { }        
        
        conditional_t<isConst, const T, T>& operator*()// перегрузки различных операторов для итераторов
        {
            return *my_pointer;
        }
        my_common_iterator& operator--()
        {
            my_pointer--;
            return *this;
        }
        my_common_iterator& operator--(int)
        {
            my_pointer--;
            return *this;
        }
        my_common_iterator& operator++(int)
        {
            my_pointer++;
            return *this;
        }
        my_common_iterator& operator++()
        {
            my_pointer++;
            return *this;
        }
        
        bool operator!=(my_common_iterator const & other) const // !!!
        {
            return other.my_pointer != my_pointer;
        }
    };
 
    using my_iterator = my_common_iterator<false>;
    using my_citerator = my_common_iterator<true>;
    
    my_iterator begin() // !!!
    {
        return my_iterator(mas);
    }
    my_iterator end() // !!!
    {
        return my_iterator(mas + size);
    }
    my_citerator begin() const
    {
        return my_citerator(mas);
    }
    my_citerator end() const
    {
        return my_citerator(mas + size);
    }
private:
    T* mas;
    size_t size;
};
int main()
{
    int* m = new int[5]{};
    my_vector<int> my_v = { 2,3,4,5,6 };
    my_vector<int>::my_iterator mitbn = my_v.begin();
    my_vector<int>::my_iterator miten = my_v.end();
    my_vector<int>::my_citerator mitb = my_v.begin();
    my_vector<int>::my_citerator mite = my_v.end();
    //*mitb = 1234;
    //*mite = 1234;
    cout << *mitb << " " << *(mite--) << endl;
    copy(mitb, mite, m);
    for (int i = 0; i < 5; i++)
    {
        cout << m[i] << endl;
    }
 
    return 0;
}
2
Заблокирован
31.07.2021, 13:14
DrOffset, мне сразу кинулось в глаза неправильные постфиксные инкремент декремент, странно что Вы их не поправили, а так то автору нужно более тщательно поработать с уже существующими итераторами, посмотреть на их код
0
31.07.2021, 13:16

Не по теме:

SmallEvil, в смысле странно? Ты думаешь я тут нанимался за всем следить и все ошибки исправлять? :)

0
Заблокирован
31.07.2021, 13:19
свой последний итератор писал для QR кода, для записи данных в матрице, минуя служебные данные, было занаятно, жаль потерялся весь код, заново писать не охота, есть другие задачи.

Добавлено через 1 минуту

Не по теме:


Цитата Сообщение от DrOffset Посмотреть сообщение
SmallEvil, в смысле странно? Ты думаешь я тут нанимался за всем следить и все ошибки исправлять? :)
нет конешно, просто странно ))



Добавлено через 45 секунд

Не по теме:

я вообще не хотел отписываться в этой теме, слишком уж много нужно пояснить автору темы

0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.07.2021, 13:25
SmallEvil, строго говоря эта реализация не является неправильной, семантике стандартной она не соответствует - это да, но без доп. контекста, не более того.
Автор вроде бы не хотел, чтобы код писали за него, а просто просил исправить ошибки компиляции.
0
0 / 0 / 0
Регистрация: 20.10.2018
Сообщений: 3
31.07.2021, 13:26  [ТС]
а что с ним не так и как сделать "так"?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.07.2021, 13:34
Цитата Сообщение от zag2pay Посмотреть сообщение
как сделать "так"?
C++
1
2
3
4
5
6
7
8
9
10
11
12
        my_common_iterator operator--(int)
        {
            my_common_iterator tmp(*this);
            --(*this);
            return tmp;
        }
        my_common_iterator operator++(int)
        {
            my_common_iterator tmp(*this);
            ++(*this);
            return tmp;
        }
Добавлено через 2 минуты
Цитата Сообщение от zag2pay Посмотреть сообщение
а что с ним не так
Обычно постфиксный оператор возвращает прежнее значение, до инкремента\декремента.

Добавлено через 3 минуты
Цитата Сообщение от zag2pay Посмотреть сообщение
C++
1
cout << *mitb << " " << *(mite--) << endl;
Таким образом эта строка после исправления станет некорректной, т.к. будет разыменовывать значение end-итератора.
Т.е. надо будет исправить так:
C++
1
cout << *mitb << " " << *(--mite) << endl;
1
0 / 0 / 0
Регистрация: 20.10.2018
Сообщений: 3
31.07.2021, 20:36  [ТС]
DrOffset, спасибо большое за ответы, но в добавок не могли бы вы, пожалуйста, объяснить, почему у меня не работало? т.е. как я понял, типы my_iterator ( my_common_iterator<false>) и my_citerator ( my_common_iterator<true>) разные(?),но компилятор расценивает как один(?). спасибо.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12927 / 6795 / 1819
Регистрация: 18.10.2014
Сообщений: 17,193
31.07.2021, 20:42
Цитата Сообщение от zag2pay Посмотреть сообщение
почему у меня не работало? т.е. как я понял, типы my_iterator ( my_common_iterator<false>) и my_citerator ( my_common_iterator<true>) разные(?)
Да, это так.

Цитата Сообщение от zag2pay Посмотреть сообщение
но компилятор расценивает как один(?)
Почему это?

Ошибка в вашем исходном варианте не имеет никакого отношения к тому, одинаковые это типы или разные. В своем коде вы просто написали две функции с одним и тем же именем и одним и тем же (пустым) набором параметров. Такого в С++ не разрешается. Для перегрузки функций в С++ наборы параметров должны быть разными.

В С++ нет перегрузки функций по типу возвращаемого значения

C++
1
2
3
int foo();
double foo(); // Ошибка! 
// То, что `int` и `double` - разные типы, ситуацию никак не спасает
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.07.2021, 20:42
Помогаю со студенческими работами здесь

Написать свой итератор, чтобы алгоритмы STL работали с моим классом
Как написать свой итератор, чтобы действовал как стандартный и мог использовать STL алгоритмы. (У меня есть класс двусвязный списко...

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

Итератор
Написал небольшой шаблонный двунаправленный список , а с итератором проблемы. Как можно исправить его или написать с нуля (итератор нужен...

Итератор ?
Как выглядит итератор на вложеный контейнер? Например осуществить доступ к 1-му символу 3-го элемента в векторе vector&lt; ...

Итератор
Добрый день. Я начинающий. Есть проект пытаюсь сделать построение-отладку выдает ошибку типа: Ошибка 1 error C2061: синтаксическая...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru