Вам нужны итераторы в вашем массиве и некоторые критерии сортировки. Начнем с итераторов:
Вам потребуется начальный итератор и конечный итератор. Начальный итератор должен указывать на первый элемент, конечный итератор должен указывать за последним элементом. Указатели являются идеальными итераторами. Массив неявно преобразуется в указатель на его первый элемент, поэтому у вас есть начальный итератор. Добавьте к нему количество элементов в массиве, и вы получите конечный итератор. Количество элементов в массиве может быть получено путем деления размера (количества байтов) массива на размер одного элемента. Собираем все вместе:
foo array[10];
const std::size_t array_size = sizeof(array)/sizeof(array[0]);
const int* array_begin = array; // implicit conversion
const int* array_end = begin + array_size;
Теперь вам нужно, чтобы алгоритм определил, какой из двух заданных объектов вашего класса является меньшим. Простой способ сделать это - перегрузить operator<
для вашего класса:
bool operator<(const foo& lhs, const foo& rhs)
{
// compares using foo's bar
return lhs.get_bar() < rhs.get_bar();
}
Теперь вы можете отсортировать ваш массив:
std::stable_sort( array_begin, array_end );
Если критерий сортировки не такой постоянный (скажем, иногда вы хотите сортировать на основе данных foo
bar
, иногда на основе его данных wrgly
), вы можете передать различные критерии сортировки алгоритм сортировки в качестве необязательного третьего параметра. Критерии сортировки должны быть функциональными. Это могут быть функции или функциональные объекты. Последние обеспечивают встраивание, поэтому они обычно лучше. Вот как:
bool compare_by_bar(const food& lhs, const foo& rhs)
{
return lhs.get_bar() < rhs.get_bar();
}
struct wrgly_comparator {
bool operator()(const food& lhs, const foo& rhs) const
{
return lhs.get_wrgly() < rhs.get_wrgly();
}
};
Вот как вы их используете:
std::stable_sort( array_begin, array_end, compare_by_bar );
wrgly_comparator wc;
std::stable_sort( array_begin, array_end, wc );
Вы также можете создать компаратор на лету:
std::stable_sort( array_begin, array_end, wrgly_comparator() );
Редактировать : Вот еще несколько советов, основанных на вашем расширенном вопросе:
sortContainer * sortList = new sortContiner [length];
создаст динамический массив в куче . В C ++ нет сборки мусора, и вы несете ответственность за очистку кучи после себя (в этом случае, вызывая delete[] sortList;
). Общеизвестно, что это трудно сделать новичкам и подвержено ошибкам даже опытным программистам. Очень вероятно, что вам нужен автоматический массив: sortContainer sortList[length];
в стеке.
Идентификатор sortContainer
говорит мне, что это контейнер. Тем не менее, это тип предметов, которые должны быть помещены в контейнер. Будьте более осторожны, выбирая идентификаторы. Правильное именование имеет большое значение для удобочитаемого и поддерживаемого кода.