![]() ![]() |
|||||||||||
1 | |||||||||||
Обход элементов std::map в порядке их создания19.03.2011, 13:18. Показов 19713. Ответов 7
Метки нет Все метки)
(
Имеется ассоциативный массив и его заполнение:
Мне хочется обойти массив в порядке создания его элементов, т.е. 10, 7, 20. Вот здесь я прочёл, что в шаблон можно подать некий третий параметр Compare 2. Как описать этот Compare для моего случая? У меня слишком маленький опыт работы с Си++, и, читая документацию, совсем сломал мозги. По исходнику контейнера map я тоже понять ничего не могу - для меня это ещё слишком сложно Добавлено через 20 минут Наконец, понял, что за ошибку выдавал компилятор, когда я пытался сделать так, как показано в примерах у людей: я Compare подавал третьим параметром в шаблон при описании массива, но итератор был написан как раньше - с двумя параметрами. Итого, получается что-то типа того:
Добавлено через 1 час 14 минут Однако при таком раскладе неправильно работает чтение элементов массива (x = arr[7]) или проверка наличия элемента (arr.find(7) != arr.end()). Так что вопрос снова актуален
0
|
|
19.03.2011, 13:18 | |
Ответы с готовыми решениями:
7
Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map? Emplace в std::map. Как добавить элемент в std::map без копирования?
|
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
|
||||||||||||
20.03.2011, 10:21 | 2 | |||||||||||
Привет! Compare относится прежде всего к ключу, и он определяет порядок сортировки по ключу. Т.е. ты можешь задать свой класс compare, который будет по своему сортировать именно ключ, а не значение.
В спецификации map написано:
Отсюда следует, что при занесении ключей и значений в карту, ключи сразу сортируются и хранятся там в отсортированном виде. Еще ссылка удалена нашел объяснение всему этому
0
|
![]() ![]() |
|
20.03.2011, 11:14 [ТС] | 3 |
TheAthlete, спасибо конечно, но ты написал то, что и так следует из документации, но не ответил ни на один из поставленных вопросов. Попробую сам на них ответить, т.к. пришло некоторое понимание
В моём примере с простой функцией сравнения конкретно в моём случае перестал работать оператор [] и метод find. А потому на этот вопрос ответ отрицательный В класс Compare нужно добавить каким-то образом информацию о порядке создания элементов. Например, это может быть ещё один map, ключ которого совпадает с ключом нашего map'а, а значение которого есть порядковый номер создания. Но такой вариант получается излишне громоздким. В моей задаче проще создать вектор из пар "ключ-значение" и добавить процедуру поиска значения по ключу.
0
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
20.03.2011, 11:34 | 4 |
1) Мапа организована как красно-черное дерево, соответственно, ключи сортируются (сравнение осуществляэтся именно предикатом переданым в третьем параметре шаблона).
2) Если стоит такая задача, то лучше использовать вектор или дек. Чтобы таки получилось использовать мапу, то ключем можно сделать время создания, а предикат сравнения использовать std::greater
0
|
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
|
||||||
20.03.2011, 12:06 | 5 | |||||
Хотя можно реализовать таким вот образом:
0
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
20.03.2011, 12:13 | 6 |
0
|
В астрале
![]() 8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
20.03.2011, 20:49 | 7 | |||||
Evg, Ну да. Аналогично будет некорректным код.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
20.03.2011, 20:56 | 8 |
я думаю это невозможно, ибо в будущем стандарте появится unordered_map, где сами по названию понимаете
сейчас он есть в бусте и std::tr1
0
|
20.03.2011, 20:56 | |
20.03.2011, 20:56 | |
Помогаю со студенческими работами здесь
8
Стоит ли очищать в деструкторе std::map , std::vecotor? std::map, std::vector и порядок обхода коллекции
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |