Скажем, у меня есть вектор целых чисел:
std::vector<int> indices;
for (int i=0; i<15; i++) indices.push_back(i);
Затем я сортирую это в порядке убывания:
sort(indices.begin(), indices.end(), [](int first, int second) -> bool{return indices[first] > indices[second];})
for (int i=0; i<15; i++) printf("%i\n", indices[i]);
Это производит следующее:
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Теперь я хочу, чтобы числа 3, 4, 5 и 6 были перемещены до конца, и сохранить для них нисходящий порядок (желательно без необходимости sort
повторного использования). То есть вот что я хочу:
14
13
12
11
10
9
8
7
2
1
0
6
5
4
3
Как мне изменить функцию сравнения std::sort
для достижения этого?
return indices[first] > indices[second]
Ты имеешь в видуreturn first < second;
?std::greater
from<functional>
. Что касается вашего вопроса, написание более подробного компаратора, который гарантирует, что ваши значения сравниваются так, как вы хотите, может быть самым простым способом сделать это.return first > second
.Ответы:
Ваша функция сравнения неверна, так как значения, которые вы получаете как
first
иsecond
являются элементамиstd::vector
. Следовательно, нет необходимости использовать их в качестве индексов. Итак, вам нужно изменитьв
Теперь о проблеме, которую вы пытаетесь решить ...
Вы можете оставить 3, 4, 5 и 6 вне сравнения с другими элементами и сравнить их друг с другом:
демонстрация
источник
Функции из библиотеки стандартных алгоритмов , как
iota
,sort
,find
,rotate
иcopy
сделают вашу жизнь проще. Ваш пример сводится к:Вывод:
@TedLyngmo в комментариях показывает, что его можно / нужно улучшить с помощью:
источник
auto b = a + 4;
неправильно (если вы хотите сохранить соответствие с предыдущим фрагментом). Это должно бытьauto b = a + 3;
потому, чтоstd::rotate
вы используетеb + 1
Решение 1
Простой подход с нелинейным компаратором.
Решение 2
Используя
std::algorithm
s (раздел)!Вопросы производительности
Может показаться, что второе решение медленнее из-за перегрузки раздела. Вероятно, нет, из-за предсказания кеша и ошибки ветвления в современных процессорах.
эталонный тест
источник
n <= 6 && 3 <= n
во все, что лучше всего подходит для целевого ЦП, чтобы вы ничего не получили, вводя числа 2 и 7, кроме потенциальной путаницы - и зачем брать указатель на вектор вместо ссылки?const
говорит читателю, что функция не меняет значение? В этом конкретном случае с одной строкой это может быть понятно, но в целом это не так.