ОБНОВЛЕНО:
Я работаю над программой, производительность которой очень важна.У меня есть вектор структур, которые НЕ отсортированы.Мне нужно выполнить много поисковых операций в этом векторе.Поэтому я решил кешировать векторные данные в карту следующим образом:
std::map<long, int> myMap;
for (int i = 0; i < myVector.size(); ++i)
{
const Type& theType = myVector[i];
myMap[theType.key] = i;
}
Когда я ищу карту, результаты остальной части программы намного быстрее.Однако остальным узким местом является создание самой карты (для вставки в нее около 1500 элементов в среднем требуется около 0,8 миллисекунды).Мне нужно найти способ сократить это время.Я просто вставляю long как ключ и int как значение.Я не понимаю, почему это занимает так много времени.
Еще одна идея, которая у меня была, - создать копию вектора (не может коснуться оригинала) и каким-то образом выполнить более быструю сортировку, чем std ::сортировать (сортировка занимает слишком много времени).
Редактировать:
Извините всех.Я хотел сказать, что я создаю std :: map, где ключ long, а значение int.Длинное значение - это ключевое значение структуры, а int - это индекс соответствующего элемента в векторе.
Кроме того, я сделал еще одну отладку и понял, что вектор вообще не отсортирован.Это совершенно случайно.Так что делать что-то вроде stable_sort не получится.
ДРУГОЕ ОБНОВЛЕНИЕ:
Спасибо всем за ответы.В итоге я создал вектор пар (std :: vector из std :: pair (long, int)).Затем я отсортировал вектор по длинному значению.Я создал собственный компаратор, который смотрел только на первую часть пары.Затем я использовал lower_bound для поиска пары.Вот как я все это сделал:
typedef std::pair<long,int> Key2VectorIndexPairT;
typedef std::vector<Key2VectorIndexPairT> Key2VectorIndexPairVectorT;
bool Key2VectorIndexPairComparator(const Key2VectorIndexPairT& pair1, const Key2VectorIndexPairT& pair2)
{
return pair1.first < pair2.first;
}
...
Key2VectorIndexPairVectorT sortedVector;
sortedVector.reserve(originalVector.capacity());
// Assume "original" vector contains unsorted elements.
for (int i = 0; i < originalVector.size(); ++i)
{
const TheStruct& theStruct = originalVector[i];
sortedVector.insert(Key2VectorIndexPairT(theStruct.key, i));
}
std::sort(sortedVector.begin(), sortedVector.end(), Key2VectorIndexPairComparator);
...
const long keyToSearchFor = 20;
const Key2VectorIndexPairVectorT::const_iterator cItorKey2VectorIndexPairVector = std::lower_bound(sortedVector.begin(), sortedVector.end(), Key2VectorIndexPairT(keyToSearchFor, 0 /* Provide dummy index value for search */), Key2VectorIndexPairComparator);
if (cItorKey2VectorIndexPairVector->first == keyToSearchFor)
{
const int vectorIndex = cItorKey2VectorIndexPairVector->second;
const TheStruct& theStruct = originalVector[vectorIndex];
// Now do whatever you want...
}
else
{
// Could not find element...
}
Это принесло мне скромный прирост производительности.Раньше общее время моих вычислений составляло 3,75 миллисекунды, а теперь оно сократилось до 2,5 миллисекунд.