将对象数组作为参数传递的最佳方法是什么

Whats the best way to pass an object array as an argument

本文关键字:最佳 方法 是什么 参数传递 对象 数组      更新时间:2023-10-16

嘿伙计们,我有一个对象数组,想知道将其作为参数传递给 c++ 函数的最佳方法是什么。

Job jobs[5];

Job 是我的类,Jobs[5] 是一个包含 5 个对象的数组

一个简单的示例,演示如何将作业数组传递给函数并使用它执行某些操作:

class Job
{
public:
    int id;
};
void SetJobIds(Job jobs[], int numJobs)
{
    // do something useful with your array of jobs
    for(int i=0; i<numJobs; ++i)
    {
        jobs[0].id = i;
    }
}
int main() {
    const int numJobs = 5;
    Job jobs[numJobs];
    SetJobIds(jobs, numJobs);
    return 0;
}

将数组传递给函数的最佳方法是使用 std::vector

否则,您将不得不传递数组、容量和元素数量。

std::vector包含这些属性并处理动态内存。 您仍然可以使用 operator[] 访问矢量中的元素。

此外,更喜欢通过引用传递(因此不制作副本(。
如果不更改函数中的向量,请通过常量引用进行传递。

通常的方法是传递指向第一个元素的指针和经过数组末尾的指针:

void my_function(Job const * begin, Job const * end);
// const if you don't modify the array values

这将适用于C++标准库使用迭代器的方式,并且可以使用泛型std::beginstd::end函数从数组中获取这两个指针:

Job jobs[4];
my_function(std::begin(jobs), std::end(jobs));

但是std::end怎么知道数组的大小呢?显然,它不能只接受指向数组元素的指针,因为使用数组 lvalue 调用它会触发数组到指针的转换(jobs&(jobs[0]) 相同(。

好吧,您还可以在C++中引用数组:

template<typename T, std::size_t Size>
T * my_end(T (& array)[Size]) {
//            ^         ^
//         reference to array
// parentheses are strictly necessary:
//    T & array[Size] is an array of references (to T)
  return array + Size;
}

最后说明:建议不要在现代C++中使用原始数组(type name[size](,而是使用std::array<type, size> name(如果大小未知/很大,则std::vector(。