![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
rp80 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Вводим пары имя-значение. Нужно посчитать сумму и медиану значений по каждому ключу. Соответственно, нужно ходить по мультимапу.
Собственно, функцию я написал, но вопрос в том оптимальное ли это решение? Смущает эта возня с итераторами.. Буду рад выслушать ваши комментарии.
|
|
|
Iron Bug |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
зачем так усложнять? у мультимапа есть equal_range и он отсортирован по ключам.
|
|
|
rp80 |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Iron Bug |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
берём первый ключ. ищем по нему интервал, считаем сумму. если последний элемент интервала не end(), то берём следующий элемент (который после конца интервала) и всё то же самое.
Сообщение отредактировал Iron Bug - 7.11.2011, 22:48 |
|
|
rp80 |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
берём первый ключ. ищем по нему интервал, считаем сумму. если последний элемент интервала не end(), то берём следующий элемент (который после конца интервала) и всё то же самое. Ага, примерно так и набросал щас. Но в общем те же яйца по моему, только в профиль. Но, тем не менее, спасибо.
|
|
|
Iron Bug |
![]()
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
ну да. вроде верно.
только вместо неуклюжего (*it).first проще писать it->first. на самом деле, второй вариант быстрее, потому что мультимап быстрее интервалы выдаёт, чем попарное сравнение ключей. впрочем, можешь ради эксперимента забить туда пару миллионов тестовых значений и посчитать время, затраченное на первый алгоритм и на второй. только вывод из цикла предварительно убрать, чтобы время считалось правильно. Сообщение отредактировал Iron Bug - 7.11.2011, 23:22 |
|
|
Iron Bug |
![]()
Сообщение
#7
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
самой стало интересно, насколько эффективность повысилась. написала быстро замер времени.
под линём получены следующие результаты сравнения данных двух реализаций: На тесте 1000000 значений pair<string,int>("one",1): без оптимизации: через указатели - 134 мс через equal_range - 66 мс при оптимизации: через указатели - 64 мс через equal_range - 56 мс результаты линейно зависят от количества значений. плюс первый вариант начинает существенно больше тормозить при длинных значениях ключа(увеличивается время на сравнение). Сообщение отредактировал Iron Bug - 8.11.2011, 17:32 |
|
|
rp80 |
![]()
Сообщение
#8
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
самой стало интересно, насколько эффективность повысилась. написала быстро замер времени. под линём получены следующие результаты сравнения данных двух реализаций: На тесте 1000000 значений pair<string,int>("one",1): без оптимизации: через указатели - 134 мс через equal_range - 66 мс при оптимизации: через указатели - 64 мс через equal_range - 56 мс результаты линейно зависят от количества значений. плюс первый вариант начинает существенно больше тормозить при длинных значениях ключа(увеличивается время на сравнение). Ну ещё одно доказательство преимущества STL над велосипедами своими. |
|
|
Iron Bug |
![]()
Сообщение
#9
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Ну ещё одно доказательство преимущества STL над велосипедами своими. ну, просто пример рационального использования STL. свои-то велосипеды пошустрее STL будут. смотря сколько времени можно затратить на проект и смотря как шустро он должен работать. в большинстве юзерских задач скорости STL вполне хватает. |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 18.2.2025, 18:53 |