Если бы у меня был класс Cell
например, который я хочу отсортировать согласно следующей функции (x
а также y
здесь быть int
переменные-члены с аксессорами):
bool sortByCoordinates(const Cell& c1, const Cell& c2) {
return c1.getX() < c2.getX() || (c1.getX() == c2.getX() && c1.getY() < c2.getY());
}
Где именно это лучшее место для размещения этой функции, чтобы я мог использовать ее с такими функциями, как std::sort
?
В примерах у них просто есть метод, плавающий в исходном файле выше, где это необходимо, но на практике я хочу, чтобы он был связан с Cell
учебный класс. Я знаю, что могу переопределить operator<
но могут быть другие методы сортировки, с помощью которых я хотел бы отсортировать Cell
и я не большой поклонник переопределения операторов для ясности кода в любом случае.
На данный момент у меня это как static
метод в моем Cell.h
файл, чтобы я мог вызвать его при сортировке следующим образом:
std::sort(cells.begin(), cells.end(), Cell::sortByCoordinates);
Является ли это наилучшей практикой для нескольких (или даже единичных) пользовательских функций сортировки, и является ли файл заголовка подходящим для них местом? Если нет, то что?
Делать так, как вы описываете, разумно. И определение функции сравнения inline
в самом заголовке хорошая идея, если вы заботитесь о производительности (а не определяете ее в файле .cpp).
Лично у меня другие предпочтения, чем у вас. Я бы объявил эту разумную функцию сравнения по умолчанию в области пространства имен (то есть прямо под классом), потому что, как написано, ей не нужен привилегированный доступ к членам класса. И я бы объявил это operator <
, Я не думаю, что есть что-то, за что можно стыдиться с точки зрения того, чтобы сделать одну функцию «особенной», когда это кажется разумным упорядочением по умолчанию.
Других решений пока нет …