Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
11 / 11 / 2
Регистрация: 18.07.2009
Сообщений: 123

Переписать std::map

09.08.2010, 20:27. Показов 3021. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Есть работающая программа, в которой используется map, все работало хорошо, но теперь немного изменились условия и объем данных, с которыми теперь придется работать значительно увеличился, в разы. Поскольку map используется во многих местах и обращение к нему происходит через итераторы, то заменять map на что-то другое крайне нежелательно, поэтому решил переписать map таким образом:
поскольку на скорость работы программы и объем данных, которые держатся в памяти сильно влияет именно значение, а не ключ map'а, т.е на каждый ключ приходится выделять память под структуру, и потом еще ее чистить, то есть идея заливать в map сначала все ключи, а значения забивать NULL, а потом при обращении к i-му элементу через итератор, определив, что там NULL подгружать данные.

Если б работал с вектором, перегружал бы operator[] и там уже подгружал данные, но вот как мне быть и что переписывать в map'e, если обращение к нему идет только через итераторы? Знатоки stl, помогите пожалуйста!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2010, 20:27
Ответы с готовыми решениями:

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map?
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

Emplace в std::map. Как добавить элемент в std::map без копирования?
здравствуйте... есть ли способ не писать так: std::map<int, char> ksa; ksa.emplace(std::piecewise_construct, ...

Очистка map и перевернутого std::map c std::greater
Написала я программу, которая заполняет два контейнера map. a,b. вывод программы такой 11 a: 0.00000000 - 0.00000000 a: 0.10000000...

11
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.08.2010, 20:42
а как это будет реализовано? унаследовано от std::map?
0
11 / 11 / 2
Регистрация: 18.07.2009
Сообщений: 123
09.08.2010, 20:58  [ТС]
Цитата Сообщение от alex_x_x Посмотреть сообщение
а как это будет реализовано? унаследовано от std::map?
да, использую наследование

Добавлено через 12 минут
хотя, если у кого есть какие другие идеи - все равно с удовольствием воспользуюсь, главное, чтоб заработало )
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.08.2010, 21:03
видимо придется перегружать begin(), end() чтобы они возвращали новые итераторы, унаследованные от std::map<..>::iterator, а там уже перегружать операторы *,++ итд

ну мне так кажется, думаю это будет не очень просто
1
11 / 11 / 2
Регистрация: 18.07.2009
Сообщений: 123
09.08.2010, 21:11  [ТС]
Цитата Сообщение от alex_x_x Посмотреть сообщение
видимо придется перегружать begin(), end() чтобы они возвращали новые итераторы, унаследованные от std::map<..>::iterator, а там уже перегружать операторы *,++ итд

ну мне так кажется, думаю это будет не очень просто
да, это на самом деле хлопотно.. а, может быть, есть какие-нибудь другие идеи? )

Добавлено через 5 минут
было б проще, если б можно было взять vector <pair<...> > и перегрузить operator[], но тогда все равно придется переоперделять оператор ++ и * и тп, но, получается, что без этого не обойтись хоть тут, хоть там (
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
10.08.2010, 00:17
Цитата Сообщение от __beginner__ Посмотреть сообщение
хотя, если у кого есть какие другие идеи
думаю - в качестве значения лучше указатели на объекты вставлять, а сами объекты где-то в куче должны создаваться.
0
 Аватар для Manjak
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
10.08.2010, 11:13
А не проще ли будет подменить немного итератор?
0
11 / 11 / 2
Регистрация: 18.07.2009
Сообщений: 123
10.08.2010, 19:17  [ТС]
Цитата Сообщение от Manjak Посмотреть сообщение
А не проще ли будет подменить немного итератор?
Manjak, а можно поподробнее?

Добавлено через 7 минут
Цитата Сообщение от easybudda Посмотреть сообщение
думаю - в качестве значения лучше указатели на объекты вставлять, а сами объекты где-то в куче должны создаваться.
может быть я вас неправильно понял, но я сначала так и хотел сделать, т.е. ключ остается ключом, а значение получать потом, при необходимости, в куче, или.. в общем, наверное просто я вас не понял (

а на самом деле, вариант с operator[] и вектором пар я сегодня реализовал и все успешно работает, но вот очень нехорошо, что нужно оставить вариант с map'ом, т.е. вектор не нужен и тут либо переписывать итераторы либо слушать новые идеи )
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.08.2010, 19:34
я не понимаю, вы хотите не модифицируя старый код сделать чтобы он заработал по-новому?
0
11 / 11 / 2
Регистрация: 18.07.2009
Сообщений: 123
10.08.2010, 19:43  [ТС]
Цитата Сообщение от alex_x_x Посмотреть сообщение
я не понимаю, вы хотите не модифицируя старый код сделать чтобы он заработал по-новому?
нет, чтобы использовать map, а не переходить к вектору пар, т.к. из-за этого придется править слишком много в слишком многих местах и очень велика вероятность там накосячить, т.е. мне нужно мой старый обычный stl' вский map переписать под новый, а потом с помощью typedef и закомментирования старого map'a и минимума телодвижений перейти к новому (а получается уже и к старому из-за typedef)
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
22.08.2010, 17:52
Какой размер данных? Одной структуры/обьекта?
Какие операции чаще всего выполняются с данными ?
Каким образом вы обращаетесь к массиву map ? Можно примеры кода ?
0
11 / 11 / 2
Регистрация: 18.07.2009
Сообщений: 123
22.08.2010, 20:13  [ТС]
Andrew_Lvov, вопрос уже давно решен, спасибо за внимание к проблеме. Вместо map использовал вектор пар, программа прекрасно работает, сейчас занимаюсь уже другими вещами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.08.2010, 20:13
Помогаю со студенческими работами здесь

Не могу разобраться как обновить в std::map<std::string, вектор_структур>
Не могу разобраться как обновить вектор структур после его добавления в map без удаления и перезаписи struct pStruct { int...

Стоит ли очищать в деструкторе std::map , std::vecotor?
У меня ещё один нубский вопрос :) Вот если в классе объявлены мапы и вектора, которые по ходу программы как то заполняются, нужно ли мне...

std::map, std::vector и порядок обхода коллекции
Здравствуйте, уважаемые! Вопрос следующий - если я сохраняю какие-то значения в map или вектор, то всегда ли я буду получать тот-же...

Std::unordered_multimap<std::string, int> map
Приветствую. Как можно получить только &quot;уникальный&quot; ключ в контейнере? std::unordered_multimap&lt;std::string, int&gt; map; ...

std::map или std::vector?
Здравствуйте. У меня есть 3 класса: клиенты банка, клиент, счёт. У класса Клиенты лишь одно поле - контейнер с экземплярами класса...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru