如何将整个结构传递给包含所有元素的函数?
How can I pass the whole struct to a function including all elements?
我有一个结构,我想传递给一个将对结构进行排序的函数。但是,我不知道如何传递整个结构。
到目前为止,我所做的是这样的:
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);
如果您不想编写函数并且有 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
等简单类型一样),请使用我 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);
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 如何查找一组类型对是否包含一个元素作为第二个成员
- 调用包含所有所需代码的函数或内部包含所需代码的其他函数的函数更好?
- 如何将整个结构传递给包含所有元素的函数?
- set.clear() 在删除元素之前调用所包含元素的析构函数
- typedef 一个包含 const 元素的数组,使用 const ArrayType 或 c++ 中的 ConstAr
- 创建包含唯一元素的优先级队列
- 使一个标头成为多个类包含所必需的
- 减去包含重复元素的向量
- 包含独特元素的列表
- std::set 在使用 std::set.erase 后包含重复元素
- 为什么双空大括号 { { } } 创建一个<double>包含一个元素而不是零元素的 std::initializer_list?
- 将包含子元素的整个QGraphicScene保存到一个文件中
- C++检查类对象是否包含某个元素
- c++ set输出的元素比它包含的元素多得多
- 为什么在使用g++ 4.8.4时,这段代码会产生一个包含单个元素的map ?
- 创建一个类,其静态成员容器包含所述类的所有实例
- 从第一个集合中删除第二个集合中包含的元素,不迭代
- make_heap() 函数参数 - 如果我不想包含某些元素怎么办?