如何将整个结构传递给包含所有元素的函数?

How can I pass the whole struct to a function including all elements?

本文关键字:包含所 元素 函数 结构      更新时间:2023-10-16

我有一个结构,我想传递给一个将对结构进行排序的函数。但是,我不知道如何传递整个结构。

到目前为止,我所做的是这样的:

void sort_datoteka_sifra(pole &artikli){
}

我像sort_datoteka_sifra(artikli[0])等一样称呼它,但它只传递 [0] 元素,我想传递整个结构,这样我就可以在函数中使用它,而不必在主函数中调用 artikli[0]、artikli[1] 等。

这里有几个选项。

  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);
    

    如果您不想编写函数并且有 C++11,则可以使用 lambda 函数:

    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<重载,就像intstd::string等简单类型一样),请使用我 https://stackoverflow.com/a/20616119/592323 的另一个答案中的compareByMember,例如,假设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);