配列をパラメーターとして渡すときに、これらのうちどれが最適か疑問に思っていましたか?
void function(int arr[]) {...};
また
void function(int* arr) {...};
理由を教えていただけますか?また、どの本を参照できますか? ありがとう!
配列をパラメーターとして渡すときに、これらのうちどれが最適か疑問に思っていましたか?
void function(int arr[]) {...};
また
void function(int* arr) {...};
理由を教えていただけますか?また、どの本を参照できますか? ありがとう!
この質問にはc++というタグが付けられているため、どちらも使用しません。これを使用する必要がある場合、どちらも同等です。
std::vector
しかし、C++ を使用しているため、そのようなタスクには を使用することをお勧めします。
void function(std::vector<int> &arr) {...}
または、配列/ベクトルを変更しない場合
void function(const std::vector<int> &arr) {...}
任意の配列 (動的に割り当てられたものを含む) を渡したいだけの場合、それらは同等です。
関数が実際の固定サイズの配列を必要とする場合は、次のようにすることができます。
template <size_t N>
void function(char (&str)[N]) { ... }
それらは意味的に同一です。
#1は、配列を渡していることを明示するため、(私の意見では)少し優れています。
あなたはどちらを選ぶか尋ねます
void function(int arr[]) {...};
と
void function(int* arr) {...};
後者ではポインタ自体を として宣言できますがconst
、前者では項目のみを として宣言できますconst
。ただし、リーダーに[]
は、おそらく単一のオブジェクトへのポインターではなく、配列が示されます。const
個人的には、 が提供する制約は、が提供する配列性を示すものよりも実用的だと思います[]
。
より高いレベルのコードについては、std::vector
またはstd::array
のいずれか適切な方を使用してください。
配列をパラメーターとして渡す最良の方法は、実際には次のとおりです。
void function(type_t* array, int amountOfElts, int arrayAllocatedElts);
場合によっては(文字列を渡すときなど)、これら2つのパラメーターをスキップできることがよくあります。ただし、たとえば文字列に対していくつかの操作を実行する場合など、どちらの方法でも役立つ場合があります。または、1、2回の呼び出しを節約できる場合もあります。
関数の引数で[]オプションを使用することは、私の意見では混乱を招くため、避ける必要があります。しかし、私はそれが慣習ではないと思います。
提供したい抽象化のレイヤーに応じて、Olaf のアプローチか、STL が優れたレベルで使用するものを選択する必要があります。
template <class Iter>
void function(Iter first, Iter last)
{
// for example, to get size:
std::size_t size = std::distance(first, last);
// for example, to iterate:
for ( Iter it = first; it != last; ++it )
{
// *it to get the value, like:
std::cout << *it << std::endl;
}
}
そうすれば、関数を配列だけでなく、さまざまな STL タイプ (ベクトル、リスト、キュー、スタックなど) にも使用できます。
int tab[4] = {1,2,3,4};
function(tab, tab+4);
std::vector<int> vec;
// fill vector with something
function(vec.begin(), vec.end());