Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 8
1

Функция erase(key) для map

24.04.2020, 16:39. Показов 2772. Ответов 13

Добрый день, пытаюсь реализовать свой stl-подобный контейнер который по факту будет являться неполной версией map.
Столкнулся с проблемой на моменте реализации метода erase, не понимаю как удалить пару<ключ, знач> из памяти.
Совсем забрел в тупик, поэтому прошу помощи, был бы крайне признателен.
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
template < typename  Key, typename  T, typename  Compare = std::less<Key>, typename  Allocator = std::allocator< std::pair<const Key, T> > >
class map
{
public:
    class miterator
    {
        public:
            typedef miterator self_type;
            typedef std::pair<const Key, T> value_type;
            typedef std::pair<const Key, T>& reference;
            typedef std::pair<const Key, T>* pointer;
            typedef std::bidirectional_iterator_tag iterator_category;
            typedef std::ptrdiff_t difference_type;
            miterator(pointer ptr) : ptr_(ptr) { };
            miterator() {}
            self_type operator=(const self_type& other) { ptr_ = other.ptr_; return *this; }
            self_type operator++() { self_type i = *this; ptr_++; return i; }
            self_type operator--() { self_type i = *this; ptr_--; return i; }
            self_type operator++(int junk) { ptr_++; return *this; }
            self_type operator--(int junk) { ptr_--; return *this; }
            reference operator*() { return *ptr_; }
            pointer operator->() { return ptr_; }
            pointer operator&() { return ptr_; }
            bool operator==(const self_type& rhs) { return ptr_ == rhs.ptr_; }
            bool operator!=(const self_type& rhs) { return ptr_ != rhs.ptr_; }
        private:
            pointer ptr_;
    };
    class mconst_iterator
    {
    public:
        typedef mconst_iterator self_type;
        typedef std::pair<const Key, T> value_type;
        typedef std::pair<const Key, T>& reference;
        typedef std::pair<const Key, T>* pointer;
        typedef std::ptrdiff_t difference_type;
        typedef std::bidirectional_iterator_tag iterator_category;
        mconst_iterator(pointer ptr) : ptr_(ptr) { };
        mconst_iterator() {}
        self_type operator=(const self_type& other) { ptr_ = other.ptr_; return *this; }
        self_type operator++() { self_type i = *this; ptr_++; return i; }
        self_type operator--() { self_type i = *this; ptr_--; return i; }
        self_type operator++(int junk) { ptr_++; return *this; }
        self_type operator--(int junk) { ptr_--; return *this; }
        reference operator*() { return *ptr_; }
        pointer operator->() { return ptr_; }
        pointer operator&() { return ptr_; }
        bool operator==(const self_type& rhs) { return ptr_ == rhs.ptr_; }
        bool operator!=(const self_type& rhs) { return ptr_ != rhs.ptr_; }
        pointer ptr_;
        
    };
 
    typedef map<Key, T, Compare, Allocator> mymap;
 
    typedef Key key_type;
    typedef T mapped_type;
    typedef std::pair<const Key, T> value_type;
    typedef std::size_t size_type;
    typedef std::ptrdiff_t difference_type;
    typedef Compare key_compare;
    typedef Allocator allocator_type;
    typedef value_type& reference;
    typedef const value_type& const_reference;
    typedef value_type* pointer;
    typedef const value_type* const_pointer;
    typedef miterator iterator;
    typedef mconst_iterator const_iterator;
    typedef std::reverse_iterator<miterator> reverse_iterator;
    typedef std::reverse_iterator<mconst_iterator> const_reverse_iterator;
 
 
 
 
 
    map()
        : size(0), capacity(20), data(Allocator().allocate(20))
    {
    }
 
    map(const mymap& _Rhs)
        : size(_Rhs.size), capacity(_Rhs.size + 20), data(Allocator().allocate(_Rhs.size))
    {
        int count = 0;
        for (iterator i = &_Rhs.data[0]; i != &_Rhs.data[_Rhs.size]; ++i, ++count)
        {
            Allocator().construct(&data[count], *i);
        }
    }
 
    ~map()
    {
        if (!empty())
        {
            Allocator().deallocate(data, capacity);
        }
    }
 
    mymap& insert(const value_type& pair)
    {
        if (!is_present(pair))
        {
            if (++size >= capacity)
            {
                reserve(capacity * 2);
            }
            Allocator().construct(&data[size - 1], pair);
            return *this;
        }
    }
 
    ...
 
    mymap& reserve(size_type _Capacity)
    {
        int count = 0;
        if (_Capacity < capacity)
        {
            return *this;
        }
        pointer buf = Allocator().allocate(_Capacity);
        for (iterator i = begin(); i != end(); ++i, ++count)
        {
            Allocator().construct(&buf[count], *i);
        }
        std::swap(data, buf);
        Allocator().deallocate(buf, capacity);
        capacity = _Capacity;
        return *this;
    }
//____________________________________________________________________
    void erace(const key_type& Key)
    {
            int n = 1;
            for (iterator i = begin(); i != end(); ++i, n++)
            {
                if (i->first == Key)
                {
                    //Данный метод.
                    
                }
            }
    }
//_____________________________________________________________________
    ...
 
    iterator begin()
    {
        return &data[0];
    }
    iterator end()
    {
        return &data[size];
    }
 
    ...
 
    }
private:
    pointer data;
    size_type size, capacity;
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2020, 16:39
Ответы с готовыми решениями:

Erase map
Добрый день, мне необходимо удалить из MAP некоторое количество элементов, сейчас я делаю это вот...

Функция считывания из файла для map
в файле задана последовательность ключ-точка(map&lt;string,MYPOINT&gt;). Помогите, пожалуйста, написать...

Не работает функция erase
Здравствуйте, не получается запустить программу из-за функции erase, компилятору что-то не...

Collection Map (Key, Value)
Добрый день. Есть коллекция Map, Map &lt;Key, Value&gt; dict = new HashMap&lt;Key, Value&gt;(); И данные...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
13
6952 / 6004 / 2725
Регистрация: 14.04.2014
Сообщений: 25,648
24.04.2020, 16:57 2
Откуда удалить-то? Как ты хранишь данные эти?
0
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 8
24.04.2020, 17:06  [ТС] 3
Выделяю память с помощью аллокатора, затем создаю объект с помощью того же аллокатора.
0
6952 / 6004 / 2725
Регистрация: 14.04.2014
Сообщений: 25,648
24.04.2020, 17:31 4
Т. е. у тебя просто массив из pair?
0
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 8
24.04.2020, 17:35  [ТС] 5
Да, совершенно верно
0
6588 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,418
Записей в блоге: 1
24.04.2020, 17:45 6
Лучший ответ Сообщение было отмечено Varde как решение

Решение

Цитата Сообщение от Varde Посмотреть сообщение
Столкнулся с проблемой на моменте реализации метода erase, не понимаю как удалить пару<ключ, знач> из памяти.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void erase(const key_type& Key)
{
    int n = 1;
    for (iterator i = begin(); i != end(); ++i, n++)
    {
        if (i->first == Key)
        {
            std::move(i + 1, end(), i);
            --size;
            std::destroy_at(data + size);
            return;
        }
    }
}
1
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 8
24.04.2020, 18:05  [ТС] 7
Пишет:
Ошибка C2039 destroy_at: не является членом "std"
<memory> заинклюдил.
0
6588 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,418
Записей в блоге: 1
24.04.2020, 18:07 8
Цитата Сообщение от Varde Посмотреть сообщение
<memory> заинклюдил.
Включи 17-стандарт. Или просто вызови вместо неё деструктор
0
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 8
24.04.2020, 18:18  [ТС] 9
Прошу прощения, мозг уже совсем не работает. Как вызвать деструктор именно для этого элемента?
0
6588 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,418
Записей в блоге: 1
24.04.2020, 18:20 10
Лучший ответ Сообщение было отмечено Varde как решение

Решение

Цитата Сообщение от Varde Посмотреть сообщение
Прошу прощения, мозг уже совсем не работает. Как вызвать деструктор именно для этого элемента?
C++
1
data[size].value_type::~value_type();
1
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 8
24.04.2020, 18:36  [ТС] 11
oleg-m1973,

Пишет:
Ошибка C2679 бинарный "=": не найден оператор, принимающий правый операнд типа "std:: pair<const Key,T>"
Что странно, ведь у pair должно быть определение =. Спасибо вам большое вы уже сильно помогли, но есть идеи насчет этого?
0
6588 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,418
Записей в блоге: 1
24.04.2020, 18:49 12
Лучший ответ Сообщение было отмечено Varde как решение

Решение

Цитата Сообщение от Varde Посмотреть сообщение
Что странно, ведь у pair должно быть определение =. Спасибо вам большое вы уже сильно помогли, но есть идеи насчет этого?
Это из-за const Key. Убери, наверное, const в value_type. Пока не знаю, как по другому
1
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 8
24.04.2020, 18:54  [ТС] 13
Сработало! Спасибо большое, с утра в этом чуде копаюсь) Так и не понял почему дело в const, но черт подери работает!
0
6588 / 4431 / 1794
Регистрация: 07.05.2019
Сообщений: 13,418
Записей в блоге: 1
24.04.2020, 18:58 14
Цитата Сообщение от Varde Посмотреть сообщение
Сработало! Спасибо большое, с утра в этом чуде копаюсь) Так и не понял почему дело в const, но черт подери работает!
Константные члены класса нельзя изменить в операторе присваивания (std::move использует именно его), можно только проинициализировать в конструкторе.
Наверное, здесь по-другому не сделаешь. boost::flat_map, тоже использует неконстантный value_type
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2020, 18:58

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Функция Erase класса vector
Нужно удалить из вектора, в котором объекты авторского класса, объекты с весом более 300. Написал...

Функция erase в делении длинных чисел
Выполняя работу по курсу программирования, встретил в коде деления длинных чисел такую строку ...

String одна функция вместо erase+append
Всем привет. Поискал, вроде нет такой функции, но вдруг есть. const string::size_type...

Поместить вектора в map и реализовать перегрузку вывода для map
Всем привет! Нужна помощь в написании программы. У меня есть вот такая прога и мне нужно каким-то...

Map-функция
Задача: Реализовать функцию (@CASE-OF &lt;селектор&gt; &lt;вариант1&gt; ... &lt;вариантN&gt; ) - аналог...

функция map
задача, из в датафрейм в зависимости от поля торговая марка добавить новый столбец, НЕlitry=...


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

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

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