5

配列をパラメーターとして渡すときに、これらのうちどれが最適か疑問に思っていましたか?

void function(int arr[]) {...};

また

void function(int* arr) {...};

理由を教えていただけますか?また、どの本を参照できますか? ありがとう!

4

6 に答える 6

4

この質問にはというタグが付けられているため、どちらも使用しません。これを使用する必要がある場合、どちらも同等です。

std::vectorしかし、C++ を使用しているため、そのようなタスクには を使用することをお勧めします。

void function(std::vector<int> &arr) {...}

または、配列/ベクトルを変更しない場合

void function(const std::vector<int> &arr) {...}
于 2013-02-18T08:44:20.480 に答える
3

任意の配列 (動的に割り当てられたものを含む) を渡したいだけの場合、それらは同等です。

関数が実際の固定サイズの配列を必要とする場合は、次のようにすることができます。

template <size_t N>
void function(char (&str)[N]) { ... }
于 2013-02-18T08:27:12.597 に答える
1

それらは意味的に同一です。

#1は、配列を渡していることを明示するため、(私の意見では)少し優れています。

于 2013-02-18T08:18:06.370 に答える
1

あなたはどちらを選ぶか尋ねます

void function(int arr[]) {...};

void function(int* arr) {...};

後者ではポインタ自体を として宣言できますがconst、前者では項目のみを として宣言できますconst。ただし、リーダーに[]は、おそらく単一のオブジェクトへのポインターではなく、配列が示されます。const個人的には、 が提供する制約は、が提供する配列性を示すものよりも実用的だと思います[]

より高いレベルのコードについては、std::vectorまたはstd::arrayのいずれか適切な方を使用してください。

于 2013-02-18T08:44:57.090 に答える
0

配列をパラメーターとして渡す最良の方法は、実際には次のとおりです。

void function(type_t* array, int amountOfElts, int arrayAllocatedElts);

場合によっては(文字列を渡すときなど)、これら2つのパラメーターをスキップできることがよくあります。ただし、たとえば文字列に対していくつかの操作を実行する場合など、どちらの方法でも役立つ場合があります。または、1、2回の呼び出しを節約できる場合もあります。

関数の引数で[]オプションを使用することは、私の意見では混乱を招くため、避ける必要があります。しかし、私はそれが慣習ではないと思います。

于 2013-02-18T08:20:41.977 に答える
0

提供したい抽象化のレイヤーに応じて、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());
于 2013-02-18T08:53:52.097 に答える