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

时间:2014-01-04 15:55:01

标签: c++ struct parameter-passing

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

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

void sort_datoteka_sifra(pole &artikli){
}

我把它称为sort_datoteka_sifra(artikli[0])等...但它只传递[0]元素,我想传递整个结构,这样我就可以在函数中使用它而无需调用artikli [0 ],artikli [1]等主要功能。

2 个答案:

答案 0 :(得分: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-arrays:

    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等简单类型就是这种情况,请使用compareByMember来自https://stackoverflow.com/a/20616119/592323的其他答案,例如假设您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);
    
  4. 当然,您可以将第三个选项与前两个选项中的一个结合起来,即提供一个按std::sort实现的排序功能。

答案 1 :(得分:1)

您的函数请求对单个元素的引用。而且你显然也只传递一个元素。因此,要传递完整数组,您应该使用指针,如果它是一个分配有new的数组或静态分配的数组,例如

void fun(pole* artikli);

否则对于C ++,通常使用std::vector并通过引用传递它:

std::vector<pole> artikli;

void fun(std::vector<pole>& artikli);