#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 в заданной области видимости, даже если вы переместите его в лямбда-функцию.