powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выбор хранилища (ключ значение)
10 сообщений из 10, страница 1 из 1
Выбор хранилища (ключ значение)
    #39243038
mybitco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите выбрать хранилище которое работает с парами ключ - значение,
Надо чтобы по ключу быстро находилось значение, надо будет изменять значение, часто надо будет просто наращивать значение(value++),
После заполнения хранилища вставки и удаления из него будут не частыми операциями, а поиск(по ключу) и изменение значения постоянными.

Хотелось бы узнать какое хранилище мне лучше использовать и какие вообще есть варианты для подобной задачи?
...
Рейтинг: 0 / 0
Выбор хранилища (ключ значение)
    #39243092
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mybitcoХотелось бы узнать какое хранилище мне лучше использовать и какие вообще
есть варианты для подобной задачи?
std::map
std::hashmap
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выбор хранилища (ключ значение)
    #39243190
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovstd::hashmap
То нестандартное.
Вместо этого есть std::unordered_map

По теме.
Хэш-таблица (std::unordered_map он же std::hashmap) - наиболее подходящий вариант.
Особенно если ключ - число.
...
Рейтинг: 0 / 0
Выбор хранилища (ключ значение)
    #39243349
mybitco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот спасибо.
Попробую использовать std::unordered_map
ключ и значение - числа (int или может long)

В 80-90% случаев надо будет найдя по ключу значение сделать value++ или value-- предварительно сравнив значение с заданным числом, как это лучше всего сделать?
возможно ли не удаляя предварительно из std::unordered_map и не добавляя туда уже потом новое значение?

я делаю так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
std::unordered_map <long,long> my_map;
auto itMap = my_map.begin();
itMap = my_map.find(key);
tmp_map_val = 0;
if (itMap != my_map.end())
{
	tmp_map_val = itMap->second;
	my_map.erase(itMap);//без этого новое значение для ключа не изменялось
}
my_map.insert(std::make_pair<long,long>((long)key, (long)(tmp_map_val + 1) ) );



но думаю что можно не удаляя из std::unordered_map изменить значение?

и еще замечание, надо чтобы у разных ключей возможно были одинаковые значения но при этом в хранилище не должно быть нескольких одинаковых ключей.
...
Рейтинг: 0 / 0
Выбор хранилища (ключ значение)
    #39243354
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так пробовал?
Код: plaintext
1.
my_map[key]++;
...
Рейтинг: 0 / 0
Выбор хранилища (ключ значение)
    #39243361
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mybitcoВ 80-90% случаев надо будет найдя по ключу значение сделать value++ или
value-- предварительно сравнив значение с заданным числом, как это лучше всего сделать?
Если это делается из разных потоков, то лучше использовать атомные билт-ины типа
compare-and-exchange.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выбор хранилища (ключ значение)
    #39243377
mybitco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TТак пробовал?
Код: plaintext
1.
my_map[key]++;



Нет, но попробую, спасибо.

но помимо простого увеличения и уменьшения надо будет предварительно все-равно значение извлечь и сравнить и только изменять значение, будет ли быстрее делать так:
Код: plaintext
1.
my_map[key]++;


чем так:
Код: plaintext
1.
my_map.insert(std::make_pair<long,long>((long)key, (long)(tmp_map_val + 1) ) );



Dimitry Sibiryakov - пока только из 1го потока планируется работа с хранилищем.
...
Рейтинг: 0 / 0
Выбор хранилища (ключ значение)
    #39243384
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
постоянные erase/insert это точно не быстро. Да и зачем? Там надо работать с itMap->second, т.е.
Код: plaintext
1.
itMap->second++;


с проверкой можно так
Код: plaintext
1.
if(my_map[key] == XXX) my_map[key]++;


если my_map[key] не существует, то создастся новый со значением 0. Из минусов тут только то, что поиск элемента пройдет дважды.

Если надо найти и много раз обращаться к одному элементу, то можно через указатель
Код: plaintext
1.
2.
3.
long* p = &my_map[key];
if(*p == XXX) (*p)++;
if(*p == YYY) (*p)--;


только учти что если будут вставки/удаления в my_map то указатель может стать неправильным.
...
Рейтинг: 0 / 0
Выбор хранилища (ключ значение)
    #39243385
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mybitcoключ и значение - числа (int или может long)
Так, может, у ключа ещё и диапазон чем-то ограничен?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выбор хранилища (ключ значение)
    #39243475
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
иногда обращаюсь к такой картинке.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выбор хранилища (ключ значение)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]