3

私は C++ が初めてで、配列を返す関数 (配列を受け取る) を取得しようとして問題が発生しています。この関数は、サイズ 4 の整数の配列の非常に基本的な並べ替えアルゴリズムです。私が持っているものは以下のとおりです。

int[] sortArrayAscending(int arrayToSort[3]) {
    int sortedArray[3];
    sortedArray[0] = minOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[1] = lowerMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[2] = higherMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[3] = maxOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    return sortedArray;
}

私は、使用する必要がある構文で本当に混乱していると思います (min、lower、higher、max への関数呼び出しはすべて正常に動作します。

助けていただければ幸いです。

ありがとうございました

EDIT2:すべてのコメントをありがとう。@Rookと@Bob Yoplaitの回答のおかげで解決しました。使用されるコードは次のとおりです。

   int* sortArrayAscending(int arrayToSort[4], int sortedArray[4]) {
    sortedArray[0] = minOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[1] = lowerMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[2] = higherMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[3] = maxOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    return sortedArray;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int testNumbers[4] = {8,14,1,27};
    int testSorted[4];
    sortArrayAscending(testNumbers,testSorted);

    for (int i = 0; i < 4; i++) {
        cout << testSorted[i] << endl;
    }

    system("pause");
    return 0;
}

ご協力いただきありがとうございます。ベクターを検索してみましょう。

PS@Luchian Grigoreのソリューションは、物事を行うためのベストプラクティスの方法である可能性が最も高いと思いますが、それは特に私の質問ではありませんでした

4

7 に答える 7

6

私はstd::array<int, 4>、最新の C++ コンパイラを使用している場合は、おそらく使用します。境界チェックとメモリ管理、および関数からの戻り/関数への受け渡しを適切に処理します。その上で既存の STLsortメカニズムと関数を使用することもできます。車輪を再発明する必要はありません!

さて、あなたの場合、

int sortedArray[3]; 

はローカル変数であり、それへの参照を直接返すべきではありません。次のようなことができます:

int* sortedArray = new int[4];
// do stuff
return sortedArray;

(配列のサイズにも注意してください。あなたの場合は 3 ではなく、4 です!) しかし、この場合、将来のある時点で配列を削除することを忘れないでください。そうしないと、アプリケーションでメモリ リークが発生します。

次のようなアプローチを使用して、参照によって配列を渡すこともできます

void sort_array(std::array<int, 4>& the_array);

また

void sort_array(int** the_array)

これらの場合、配列をその場で変更するか、並べ替えが完了したら答えを引数にコピーできます。

于 2012-06-14T09:01:30.693 に答える
4

編集: 編集後、関数は配列へのポインターを返します。動作するはずです。

ポインターまたはstd::vector.

sortedArrayコードでは、メソッドの最後でスコープ外になり、メモリが解放されるため、未定義の動作が発生することに注意してください。

代わりにこれを行います:

std::vector<int> sortArrayAscending(int arrayToSort[4]) {
    std::vector<int> sortedArray(4);
    sortedArray.push_back( minOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]));
    sortedArray.push_back(  lowerMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]));
    sortedArray.push_back( higherMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]));
    sortedArray.push_back( maxOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]));
    return sortedArray;
}

実際、私はしません。std::sort独自の関数を作成する代わりに使用するだけですが、それは私だけです。

于 2012-06-14T08:58:54.403 に答える
2

これは C++ であるため、std::vector<int>代わりにa を使用することをお勧めします。

std::vector<int> sortArrayAscending(int arrayToSort[3]) {    
    std::vector<int> sortedArray(4); // Note 4, not 3.
    sortedArray[0] = ...;
    sortedArray[1] = ...;
    sortedArray[2] = ...;
    sortedArray[3] = ...;

    return sortedArray;
}

実行しているように見えるタスクのいくつかを実行するいくつかのアルゴリズムが既に利用可能であることに注意してください。

于 2012-06-14T09:00:41.783 に答える
2

ローカル変数へのポインターを返しているため、未定義の動作が発生します。 sortedArrayは、自動ストレージ期間を持つ静的に割り当てられた配列です。つまり、関数のスコープを離れると、それが存在するメモリが解放されます。

を使用して動的に割り当てる必要があります。代わりにnew[]使用することをお勧めします。std::vectorを使用して割り当てることを選択した場合は、このメモリが不要になったときに をnew[]呼び出して解放することを忘れないでください。delete[]

また、 からまでint sortedArray[3];のインデックスが付けられた 3 つの要素のサイズの配列を宣言していることにも注意してください。サイズが 3 の配列の 4 番目の要素にアクセスする場合 ( 「配列オブジェクトの最後の要素を超えて」メモリにアクセスする場合)、動作も未定義です。02

于 2012-06-14T08:59:09.090 に答える
1

Javaとは違う

func にパラメーターとして sortedArray を渡すか、

int* sortArrayAscending(int* arrayToSort, int* sortedArray) {
    sortedArray[0] = minOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[1] = lowerMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[2] = higherMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[3] = maxOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    return sortedArray;
}

void toto() {
  int array[4]; // and fill values...
  int sortedArray[4];
  sortArrayAscending(array, sortedArray);
}

また

int* sortArrayAscending(int* arrayToSort) {
    int* sortedArray = new int[4];
    sortedArray[0] = minOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[1] = lowerMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[2] = higherMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[3] = maxOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    return sortedArray;
}

2 番目のケースでは、返された配列を削除する必要があります。

于 2012-06-14T09:12:25.897 に答える
1

C 配列に適切な値のセマンティックを提供する Boost::Array (または C+11 では std::array) を使用します。

boost::array<int,4> sortArrayAscending(boost::array<int,4>7 arrayToSort) 
{
    boost::array<int,4> sortedArray;
    sortedArray[0] = minOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[1] = lowerMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[2] = higherMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[3] = maxOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    return sortedArray;
}
于 2012-06-14T08:58:37.307 に答える
0

配列は、常に C++ の関数への参照によって渡されます。したがって、配列を関数に渡すだけです。元の配列はソートされ、プログラムで使用できます。配列を明示的に返す必要はないと思います。

于 2012-06-14T09:05:38.520 に答える