Код на C для сортировки массива индексов по возрастанию и убыванию

#c 11

#c 11

Вопрос:

Я использую следующее, и оно кажется подробным. Мне интересно, можно ли его сократить и при этом выполнить то же самое. Пожалуйста, предположите, что все переменные инициализированы соответствующими значениями.

 if (direction < 0) {
    std::stable_sort(ndx, ndx   Rows, [OffsetCol](long lhs, long rhs) {return CompareVariantsDescending(OffsetCol   lhs, OffsetCol   rhs);});   
} else {
    std::stable_sort(ndx, ndx   Rows, [OffsetCol](long lhs, long rhs) {return CompareVariantsAscending(OffsetCol   lhs, OffsetCol   rhs);});
}
  

Я подумал о добавлении direction в список захвата лямбда-кода и использовании его в теле лямбда-кода. Но мне кажется, что это было бы неэффективно, поскольку решение о том, каким способом сортировать, будет оцениваться при каждом обмене, а не перед началом сортировки.

Я также подумал о версии с троичным оператором, но это заняло бы одну очень длинную строку кода.

Есть ли другой вариант?

Комментарии:

1. Я бы сказал, что на самом деле это не так многословно. Но вместо этого идите другим путем и разбейте его на большее количество строк для наглядности … т. Е. предпочитайте ясность сжатию большого количества строк — просто мое предпочтение.

2. В большинстве случаев я бы предпочел такой код, поскольку мне легче понять, что он делает. И я бы тоже не стал втискивать это в одну строку. Что иногда может улучшить читаемость, так это локальные псевдонимы имен функций: constexpr auto Descending = CompareVariantsDescending; ... std::stable_sort(ndx, ndx Rows, [OffsetCol](long lhs, long rhs) {return Descending(OffsetCol lhs, OffsetCol rhs);}); , чтобы вы четко видели, о чем идет речь Descending , и не отвлекались на CompareVariants . Но только если область действия этого псевдонима короткая (не более нескольких строк).

3. Если перемещение direction в тело лямбда-выражения плохо скажется на производительности, это нелегко сказать. Предсказание ветвления и оптимизация компилятора могут привести к одинаковой производительности, если direction значение const в заданной области видимости, даже если вы переместите его в лямбда-функцию.