LINUX.ORG.RU

map без сортировок и группировок

 ,


0

1

Работаю с одним rest api, использую libcurl и std:: контейнеры для обработки ответа. Ответ от сервера приходит в формате

ключ=значение\n
ключ2=значение2\n
ключ3=значение3\n...

Пока ключи были уникальные, проблем не было, использовал std::map для хранения ответа.

Появилась функция в api, возвращающая неуникальные ключи, которые идут группами:

ключ=значение\n
ключ2=значение2\n
ключ=значение\n
ключ2=значение2\n...

std::map не прокатил, потому что работает только с уникальными ключами

std::multimap - потому что сортирует содержимое по значению ключей

std::unordered_multimap - потому что группирует дублирующиеся ключи в buckets.

Подскажите пожалуйста map-подобный контейнер, который ничего не сортирует и не группирует. Не хотелось бы менять способ хранения, придется в других местах много менять.


Чем тебя не устраивает сортировка/группировка?

И, да, ты вообще имеешь какое-то понятие о структурах данных?

devsdc ★★ ()

Я не понял, что нужно сделать с парами, имеющими совпадающие ключи. Выкинуть всё, кроме первого? Автомагически пронумеровать? Как ты собрался вытаскивать их из контейнера-то обратно?

ilammy ★★★ ()
Ответ на: комментарий от devsdc

И, да, ты вообще имеешь какое-то понятие о структурах данных?

Имею.

Мой парсер сначала разбивает ответ на вектор из «ключ=значение». Потом каждый элемент разбивет на «ключ» и «значение» по знаку «=» и складывает в map. Потом из map собирается нужная структура/объект в зависимости от запроса. До сих пор не было ответов с дублирующимеся полями. Наверно проще будет вместо map использовать вектор структур и 2-мя полями для «ключа» и «значения».

Просто я думал что можно обойтись каким-нибудь существующим контейнером (плохо знаю stl)

ALeo ()

std::unordered_multimap - потому что группирует дублирующиеся ключи в buckets.

this.

ну или std::vector<std::pair<YourKeyType, YourValueType>>

dib2 ★★★★★ ()
Ответ на: комментарий от ilammy

Прохожу по map-у, складываю элементы в объект, как только встречаю повторение ключа, кладу объект в вектор, и начинаю заполнять поля нового объекта. Как-то так.

ALeo ()
Ответ на: комментарий от ALeo

А, так тебе нужно, чтобы проход по ключам был в том же порядке, в каком они тебе пришли от сервера? Тогда тебе не нужен map, тебе нужен просто вектор пар ключ-значение.

devsdc ★★ ()
Ответ на: комментарий от devsdc

Ага, точно, dib2 выше тоже написал, похоже то что мне нужно.

ALeo ()
Ответ на: комментарий от ALeo

Ну тогда я тебе посоветую всё же почитать о структурах данных, ибо, судя по всему, понимаешь ты их плохо. Никакой map никоим образом тебе не гарантирует сохранность порядка ключей, он не для этого вообще придуман.

devsdc ★★ ()

Либо вектор пар и обрабатывай его потом как хочешь, либо научись определять начало группы, определяй и клади каждую группу в свой map.

slovazap ★★★★★ ()
Ответ на: комментарий от slovazap

Сделал вектор пар. Так проще всего оказалось.

ALeo ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.