私はオブジェクト配列を持っていて、それをC++の関数の引数として渡す最善の方法が何であるか疑問に思っています。オブジェクト配列を引数として渡す最善の方法
Job jobs[5];
仕事は私のクラスで、ジョブズは、[5]関数に配列を渡すための最良の方法はstd::vector
を使用することです5つのオブジェクト
私はオブジェクト配列を持っていて、それをC++の関数の引数として渡す最善の方法が何であるか疑問に思っています。オブジェクト配列を引数として渡す最善の方法
Job jobs[5];
仕事は私のクラスで、ジョブズは、[5]関数に配列を渡すための最良の方法はstd::vector
を使用することです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;
}
イディオムC++(標準ライブラリを読む)では、代わりに過去のポインタを使います。 –
の配列です。
それ以外の場合は、配列、容量、要素数を渡す必要があります。
std::vector
にはこれらの属性が含まれており、動的メモリも扱います。 operator[]
を使用すると、ベクトル内の要素にアクセスできます。
また、参照渡し(コピーが作成されないように)することをお勧めします。
関数内のベクトルを変更しない場合は、定数参照を渡します。
通常のアプローチは、最初の要素と、配列の末尾過去のポインタへのポインタを渡すことです:あなたができる上これはC++標準ライブラリは、イテレータを使用する方法と意志を作品
void my_function(Job const * begin, Job const * end);
// const if you don't modify the array values
、そしてよりあなたの配列から、これら二つのポインタを取得するために、一般的なstd::begin
とstd::end
機能を使用します。
Job jobs[4];
my_function(std::begin(jobs), std::end(jobs));
をしかし、どのようにstd::end
は、配列のサイズを知っているのですか?明らかに、配列要素を指すポインターを受け入れることはできません。配列lvalueを呼び出すと、配列からポインターへの変換が行われます(jobs
は&(jobs[0])
と同じです)。それは大きさならばstd::array<type, size> name
(またはstd::vector
を使用することをお勧めします++代わりに現代のC生のアレイ(type name[size]
)を使用する:
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++での配列への参照を持つことができます不明/大)。機能にジョブの配列を渡すとそれに何かをする方法を示し
これは非常に早いあなたからリードしているものは何でもテキストでカバーされるべきです。 – user4581301
私たちはこれを編集して "どうすれば[..]への最善の方法"の代わりに "[..]"を読むべきですか? –