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

Реализация Map итератора

20.02.2017, 16:44. Показов 12060. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Можно ли показать реализацию и применение простейшего итератора для данного контейнера, который я создал?

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
#include<iostream>
 
template <typename T1, typename T2>
struct T
{
    T1 key;
    T2 dat;
};
 
template <typename T1, typename T2>
class Map
{
    size_t Size;
    T<T1,T2>* data;
public:
 
    Map();                  //Конструктор по умолчанию
    Map(std::string);       //Конструктор с параметрами
    size_t size();          //Размер ассоциативного массива
    void insert(T1, T2);    //Добавить ключ-значение
    void remove(T1);        //Удалить ключ-значение по ключу
    void remove_i(size_t);  //Удалить ключ-значение по индексу
    void show();            //Вывод на экран всех слотов
    void show_slot(size_t); //Вывести на экран по индексу ключ-значение
    void clear();           //Уничтожить ассоциативный массив
 
    bool check_key(T1);                 //Проверить ключ на существование
    T2 get_data(T1);                    //Получить значение по ключу
    void set_key(size_t, T1 value);     //Задать ключ по индексу
    size_t get_index(T1);               //Получить индекс по ключу
 
    Map<T1,T2>& operator=(Map<T1,T2> const &map2); //Перегрузка оператора присваивания
 
};


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
#include <iostream>
#include "map.h"
#include "map.cpp"
 
 
int main()
{
    Map<int, std::string> A;
    A.insert(12,"k");
    A.insert(51,"h");
    A.insert(72,"t");
    A.insert(31,"f");
    std::cout << "All elements of map A: " << std::endl;
    A.show();
    std::cout << std::endl;
 
    A.remove(72);
    A.remove(51);
    std::cout << "All elements of map A after remove: " << std::endl;
    A.show();
    std::cout << std::endl;
 
    std::cout << "Check elements for exist: ";
    std::cout << A.check_key(51) << std::endl;
    std::cout << "Get data for key 31: ";
    std::cout << A.get_data(31) << std::endl;
    std::cout << "Get slot for infex 0: ";
    A.show_slot(0);
    std::cout << std::endl;
 
    Map<int, std::string> B;
    B = A;
    std::cout << "All elements of map B after B=A: " << std::endl;
    B.show();
    std::cout << std::endl;
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2017, 16:44
Ответы с готовыми решениями:

Создание итератора map сдвинутого на n
Доброго времени суток :) Допустим есть функция которая вернет константную ссылку на элемент. ...

Возврат итератора map из шаблонной функции
Собственно, вот: Вызов функции: Find&lt;map&lt;string, Circle*&gt;, map&lt;string,...

реализация итератора
Реализация класса List и его итератора: #ifndef LIST_H #define LIST_H #include&lt;iostream&gt; ...

Упрощенная реализация итератора
- Доброго дня завсегдатаи ! Видел на Вашем форуме упрошенную реализацию контейнера std::vector. ...

4
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
20.02.2017, 17:22 2
Ишук, глянь сюда. Там представлен простейший пример итератора и методов, которые там должны быть. В твоем случае внутри итератора будет хранится указатель на какой-то элемент в массиве data, или на весь контейнер - зависит от реализации твоего Map и как ты его хочешь обходить.

Цитата Сообщение от Ишук Посмотреть сообщение
#include "map.cpp"
Что это за фигня? Так делать нельзя.
0
1 / 1 / 1
Регистрация: 25.04.2012
Сообщений: 59
20.02.2017, 18:15  [ТС] 3
Попытался вывести данные, но программа вылетает, выводя на экран только 1-й элемент

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct iterator
    {
        T2 *ptr;
        iterator (T2* ptr_=0) : ptr(ptr_) {}
        T2& operator*() { return *ptr; }
        T2* operator->() { return ptr; }
        T2* operator++() { return ++ptr; }
        T2* operator--() { return --ptr; }
        bool operator==(const iterator& other) const { return ptr == other.ptr; }
        bool operator!=(const iterator& other) const { return !(*this == other); }
    };
    iterator begin () { return &data->dat; }
    iterator end () { return &data->dat+Size; }
C++
1
2
    for (Map<int, std::string>::iterator it = A.begin(); it != A.end(); ++it)
            std::cout<<*it<<"\n";
А при попытке вывести ключи выводится только первый ключ верно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct iterator
    {
        T1 *ptr;
        iterator (T2* ptr_=0) : ptr(ptr_) {}
        T1& operator*() { return *ptr; }
        T1* operator->() { return ptr; }
        T1* operator++() { return ++ptr; }
        T1* operator--() { return --ptr; }
        bool operator==(const iterator& other) const { return ptr == other.ptr; }
        bool operator!=(const iterator& other) const { return !(*this == other); }
    };
    iterator begin () { return &data->key; }
    iterator end () { return &data->key+Size; }
C++
1
2
    for (Map<int, std::string>::iterator it = A.begin(); it != A.end(); ++it)
            std::cout<<*it<<"\n";
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
20.02.2017, 18:34 4
Ишук, сделай лучше итератор с указателем на T<T1,T2>. И чтобы он работал со стандартной библиотекой, нужно все же отнаследоваться от std::iterator как в примере (подправив типы согласно документации).

Цитата Сообщение от Ишук Посмотреть сообщение
C++
1
T1* operator++() { return ++ptr; } T1* operator--() { return --ptr; }
Если бы ты посмотрел пример по ссылке, то понял бы, что тип возвращаемого значения тут неверный.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
20.02.2017, 18:35 5
Цитата Сообщение от Ишук Посмотреть сообщение
Можно ли показать реализацию и применение простейшего итератора для данного контейнера, который я создал?
C++
1
typedef T<T1,T2>* iterator;
0
20.02.2017, 18:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2017, 18:35
Помогаю со студенческими работами здесь

Реализация итератора для шаблонного класса
Изучаю С++. Решил реализовать свой вариант контейнера vector. Класс решил сделать шаблонным. Чтобы...

Реализация контейнера по типу map
Необходимо создать пользовательский класс по типу map, для реализации &quot;словаря&quot;. Можете помочь с...

Map, как получить значение итератора
Помогите разобраться, как сохранить взятое значение из списка? Явно что-то не так делаю spisok...

Правильна ли такая реализация итератора?
Доброе время суток. Есть класс очередь, реализован через массив, добавление идет просто подряд за...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru