std::map

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Alezis
Сообщения: 98
Зарегистрирован: 16 авг 2004, 01:10
Откуда: Минск
Контактная информация:

Мне нужно было создать ас. контейнер в котором ключом есть int а самим значением какой-то объект, котрый представляет собой структуру с некоторыми данными параметрами. Объектов в среднем что то вроде 1млн. , затраты памяти пока ужасные но этого пока не касаемся. map сортирует всё по убыванию моего ключа, это меня устраивает. Вопрос вот в чем. Когда я начинаю обработку этих объектов , то уж больно "долго" идёт эта обработка. Счас уточню. Долго относительно того же алгоритма только на CSharp где место map используется Hashtable. Она тоже сортирует по убыванию ключа что мне и надо. Так вот CSharp работает допустим 8 сек. ТО С++ около 25. Ошибки в алгоритме нет. просто мот сам цикл долго ходит. он типа такой.

Код: Выделить всё

Obj* o; 
for(iterator = _map.begin();!(iterator == _map.end());iterator++)
{
 std::pair<int,Obj*> s = *iterator;
 o = s.second;
....
}
Как мот лучше огранизовать перебор.

Далее.Если я ставлю hash_map
Всё не отсортировано, но это меня тоже устраивает.
Но теперь как организовать перебор потому что насколько я понимаю
через iterator не покатит.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

перебор оптимизировать можно если идти с конца в начало
плюс возможно стоит условие окончания модифицировать таким образом чтобы вынести получение нужного элемента до цикла а в цикле сравнивать с полученным значением.
все зависит от версии и настроек компилятора - но наиболее часто помогающие способы я написал.
В SAD - все в SAD.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Если добавления происходят редко, то можно использовать std::vector< std: :p air<int, ValType> > , затем поддерживать все это дело в отсортированном состоянии и искать бинарным поиском. Можешь взять из Loki класс Loki::AssocVector, он все это делает автоматически.
2B OR NOT(2B) = FF
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Относительно hash_map. Он а) хранит элементы в отсортированном виде (один из параметров конструктора включает предикат сортировки) и б) содержит внутренний тип iterator, аналогично другим контейнерам STL. Надо только иметь в виду, что в разных версиях STL hash-контейнеры могут и не включаться в std namespace, например, в Visual C++ .NET 2003 требуется указывать дополнительно using namespace <stdext>
Alezis
Сообщения: 98
Зарегистрирован: 16 авг 2004, 01:10
Откуда: Минск
Контактная информация:

мда... чёто тут попробовал и list и hash и map. Всё как то медленно пашет. Просто когда загоняю в контейнер значения (1000000 штук) они только могут удалятся, но не добавляться. Т.е. после обработки всего контейнера, оттуда например надо удалить 300000 штук. т.е. остаётся 700000. Ну и так далее в итоге должно оставаться около 5000 сиз 1 миллиона. я вот думаю забить на stl и сделать с помощью обычных массивов. Хотя мот просто алгоритм жрёт много.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Если массив отсортирован по какому-то ключевому параметру, то поиск в нём осуществляется не последовательным перебором, а методом деления пополам (т.н. бинарный поиск). Для поиска значения в массиве из 1.000.000 элементов потребуется не более 20 итераций. Ещё для организации большого массива данных и поиска значений по индексу используют бинарное дерево сортировки. Об этом отдельный разговор. Контейнеры STL свми по себе довольно медленные, поэтому неудивительно, что у тебя программа тормозит и большой расход памяти наблюдается.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

А нафиг тебе в память такие большие объемы загружать? Используй B* деревья и грузи их по кусочкам
2B OR NOT(2B) = FF
Ответить