У меня есть структура, которую я хочу передать функции, которая будет сортировать структуру. Однако я не знаю, как передать структуру WHOLE.
То, что я сделал, это до сих пор:
void sort_datoteka_sifra(pole &artikli){
}
И я называю это как sort_datoteka_sifra(artikli[0])
т.д., Но он пропускает только элементы [0], я хочу передать всю структуру, чтобы я мог использовать ее в функции без вызова artikli [0], artikli [1] и т.д. в основной функции.
Здесь у вас есть несколько вариантов.
Передайте массив как указатель на его первый элемент, а также количество элементов:
void sort_datoteka_sifra(pole *artikli, int count){
}
Если count
является статическим (известно во время компиляции), вы также можете передать массив по ссылке:
void sort_datoteka_sifra(pole (&artikli)[100]){
}
Если вы не хотите жестко кодировать счетчик, используйте шаблон функции:
template <int N>
void sort_datoteka_sifra(pole (&artikli)[N]){
}
Используйте std::vector
вместо C-массивов:
void sort_datoteka_sifra(std::vector<pole> &artikli){
}
Используйте std::sort
вместо вашей пользовательской функции сортировки (#include <algorithms>
) и используйте ее либо с существующим C-массивом, либо (рекомендуется) std::vector
:
std::sort(std::begin(artikli), std::end(artikli));
Вы должны предоставить способ сравнения двух объектов; это выполняется либо с помощью operator<
перегрузки, либо путем передачи функции (или функтора) в алгоритм сортировки:
bool comparePole(const pole & a, const pole & b) {
return /* condition when you want to have a before b */
}
std::sort(std::begin(artikli), std::end(artikli), &comparePole);
Если вы не хотите писать функцию и иметь С++ 11, вы можете использовать лямбда-функцию:
std::sort(std::begin(artikli), std::end(artikli), [](const pole & a, const pole & b) {
return /* condition when you want to have a before b */
});
Если вы хотите сравнить элементы с помощью некоторого члена (который имеет соответствующий operator<
перегрузка, что имеет место для простых типов, таких как int
, std::string
и т.д.), Используйте compareByMember
из моего другого ответа в qaru.site/questions/4317063/..., например, пусть pole
имеет int ID
по которому вы хотите отсортировать:
std::sort(std::begin(artikli), std::end(artikli), compareByMember(&pole::ID));
Чтобы отсортировать count
массива, не используйте std::end
но:
std::sort(std::begin(artikli), std::begin(artikli) + count, &comparePole);
Конечно, вы можете объединить третий вариант с одним из первых двух, то есть предоставить функцию сортировки, которая реализуется в терминах std::sort
.
Ваша функция запрашивает ссылку на один элемент. И вы, очевидно, также передаете только один элемент. Итак, чтобы передать полный массив, вы должны использовать указатель, если это массив, выделенный new
или статически выделенным массивом, например
void fun(pole* artikli);
В противном случае для C++ обычно используется std::vector
и передает его по ссылке:
std::vector<pole> artikli;
void fun(std::vector<pole>& artikli);
pole artikli[100]
.