@ fas написал в комментарии:
Элементы вектора перемещаются во время сортировки, поэтому их указатели также меняются и scores_map
становится недействительным, не так ли?
Это правильно. Вы не должны использовать указатели в качестве ключей в scores_map
.
Опция 1
Если вектор содержит уникальные элементы, вы можете использовать T
в качестве типа ключа.
for (const auto& el : my_vec)
scores_map[el] = calc_score(el);
Затем выполните сортировку, используя:
std::sort(my_vec.begin(), my_vec.end(),
[&my_map](const auto& a, const auto& b){return my_map[a] > my_map[b];});
Вариант 2
Если вектор не содержит уникальных элементов, вы можете использовать следующую стратегию.
- Используйте индексы в качестве ключа
my_map
. - Создайте вспомогательный
std::vector<size_t>
объект, содержащий только индексы. - Сортируйте вектор индексов.
- Используйте отсортированные индексы вектор для извлечения элементов из
my_vec
.
for (size_t i = 0; i < my_vec.size(); ++i )
scores_map[i] = calc_score(my_vec[i]);
// Create the vector of indices
std::vector<size_t> indices_vec(my_vec.size());
for ( size_t i = 0; i < indices_vec.size(); ++i )
{
indices_vec[i] = i;
}
// Sort the vector of indices
std::sort(indices_vec.begin(), indices_vec.end(),
[&my_map](size_t a, size_t b){return my_map[a] > my_map[b];});
for (auto index : indices_vec)
{
// Use my_vec[index]
}