我有一个结构,我想传递给一个将对结构进行排序的函数。但是,我不知道如何通过整个结构。
到目前为止,我所做的是:
void sort_datoteka_sifra(pole &artikli){
}
我把它称为sort_datoteka_sifra(artikli[0])
等...但它只传递[0]元素,我想传递整个结构,这样我就可以在函数中使用它而无需调用artikli [0 ],artikli [1]等主要功能。
答案 0 :(得分:3)
这里有几种选择。
将数组作为指向其第一个元素的指针以及元素数量传递:
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-arrays:
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);
如果您不想编写函数并使用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<
重载来比较元素,对于int
,std::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);
当然,您可以将第三个选项与前两个选项中的一个结合起来,即提供一个按std::sort
实现的排序功能。
答案 1 :(得分:1)
您的函数请求对单个元素的引用。而且你显然也只传递一个元素。因此,要传递完整数组,您应该使用指针,如果它是一个分配有new
的数组或静态分配的数组,例如
void fun(pole* artikli);
否则对于C ++,通常使用std::vector
并通过引用传递它:
std::vector<pole> artikli;
void fun(std::vector<pole>& artikli);