Как я могу передать всю структуру функции, включая все элементы?

0

У меня есть структура, которую я хочу передать функции, которая будет сортировать структуру. Однако я не знаю, как передать структуру WHOLE.

То, что я сделал, это до сих пор:

void sort_datoteka_sifra(pole &artikli){
}

И я называю это как sort_datoteka_sifra(artikli[0]) т.д., Но он пропускает только элементы [0], я хочу передать всю структуру, чтобы я мог использовать ее в функции без вызова artikli [0], artikli [1] и т.д. в основной функции.

  • 2
    Под структурой вы подразумеваете массив?
  • 0
    У меня есть структура с именем pole, в которой есть несколько элементов и массив, объявленный в структуре. Итак, да .. Я хочу передать весь массив одновременно, а не только один за другим.
Показать ещё 2 комментария
Теги:
struct
parameter-passing

2 ответа

3
Лучший ответ

Здесь у вас есть несколько вариантов.

  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]){
    
    }
    
  2. Используйте std::vector вместо C-массивов:

    void sort_datoteka_sifra(std::vector<pole> &artikli){
    
    }
    
  3. Используйте 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.

  • 0
    Спасибо за рекомендацию. Я не могу использовать векторы, это должен быть массив, и причина, по которой я хочу передать весь массив новой функции, заключается в том, что я буду выполнять сортировку внутри этой функции (не мою собственную сортировку, но я буду используя sort () за исключением отдельной функции вместо main).
  • 0
    Тогда я рекомендую использовать 1. и реализовать функцию, как в 3.
Показать ещё 5 комментариев
1

Ваша функция запрашивает ссылку на один элемент. И вы, очевидно, также передаете только один элемент. Итак, чтобы передать полный массив, вы должны использовать указатель, если это массив, выделенный new или статически выделенным массивом, например

void fun(pole* artikli);

В противном случае для C++ обычно используется std::vector и передает его по ссылке:

std::vector<pole> artikli;

void fun(std::vector<pole>& artikli);
  • 0
    Это не массив, выделенный с новым. Это просто обычный массив. pole artikli[100] .
  • 0
    Это также относится и тогда.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню