2

だから最初の質問、私はここにこの配列を持っています:

arr[] = {1; 2; 3; 4; 5}

たとえば、次のように入力すると、3番目の要素が削除され、次の値に置き換えられます。このような:

arr[] = {1; 2; 4; 5}

私はここにこのコードを持っています:

for(int i = 2; i < n; i++)
{
    arr[i] = arr[i + 1];
    arr[n - 1] = 0;
}

しかし、結果は

arr[] = {1; 2; 4; 0; 0}

コードを修正してください

2番目の質問、「3」も入力しますが、3番目の要素を削除して置き換える代わりに、新しい3番目の要素(「50」)を挿入して、次のようにする必要があります。

arr[] = {1; 2; 3; 4; 5}

となります:

arr[] = {1; 2; 50; 3; 4; 5}

私はまだプログラミングとC++の初心者であり、これが私の最初の質問なので、うまく答えてください:D

どうもありがとう

4

7 に答える 7

7

いいえ、要素が「削除」されることはありません。配列のサイズはコンパイル時に決定され、固定されます。

実行時に配列のサイズを変更する必要がある場合は、代わりにstd::vectorを使用することを検討してください。

于 2012-08-06T09:51:57.100 に答える
2

最初の質問の問題は、 for サイクルの反復ごとに配列の最後の要素を 0 に設定しているため、サイクルの最初のパスの後、{1, 2, 4, 4, 0}, nextになり{1, 2, 4, 0, 0}ます。for ループ
の外に置くだけで十分です。arr[n - 1] = 0;同様に:
編集:範囲外にならないようにループ制御ステートメントを更新しました、hmjdに感謝します

for(int i = 2; i < n-1; i++) 
{
    arr[i] = arr[i + 1];   
}
arr[n - 1] = 0;

要素自体は削除されず、0 に設定され、残りは左にシフトされます。

2 番目の質問については、何かを追加するには、より大きなサイズの新しい配列を作成する必要があります。
必要なのは、malloc関数callocfree関数です。それらと一般的な動的割り当てに慣れてください。一般的な考え方はmalloccalloc現在の配列よりも 1 大きいサイズの配列を作成し、別の要素を挿入するスペースまで要素をコピーし、その要素を挿入してから、残りの配列をコピーすることです。その後、古い配列を忘れずにfree、新しい配列へのポインタを設定してください。

int size = 4;
int arr[] = (int *) calloc(size, sizeof(int));
int insertTo = 2;
int insert = 50;
int tempArr[] = (int *) calloc(size+1, sizeof(int));
for(int i = 0, int j = 0; i < size; i++, j++) {
    if(j == insertTo) {
        tempArr[j] = insert;
        i--; //to offset the cycle incrementation
    } else {
        tempArr[j] = arr[i];
    }
}
free(arr);
arr = tempArr;
size++; // Don't forget to update the size

簡潔にするために割り当てチェックを省略しました。
同様のアプローチを最初の質問に使用して、配列のサイズを変更できます。

于 2012-08-06T10:11:00.357 に答える
1

動く

arr[n - 1] = 0; 

1を取得するためのループの後。2; 4; 5; 0:

for(int i = 2; i < n - 1; i++)
    arr[i] = arr[i + 1];
arr[n - 1] = 0; 
于 2012-08-06T09:54:42.747 に答える
1

標準 C++ ライブラリ関数を使用して、配列要素を挿入または削除し、サイズを変更します。

配列に要素を挿入する場合std::vector::insert

配列から要素を削除または消去する場合std::vector::erase

于 2017-01-23T20:00:21.613 に答える
0

arr[] = {1; 2; 3; 4; 5}5つ(それ以下でもそれ以上でもない)の整数値を保持するのに十分なメモリを正確に割り当てます。

コード内で要素をシフトするときは、まさにそれを実行しています-シフト。これらの操作で「メモリ」が解放または追加されることはありません。

このような挿入/削除操作の結果として配列のサイズを本当に変更する必要がある場合、適切なサイズの新しい配列を割り当て、古い配列から新しい配列にデータをコピーする必要があります(そして、必要に応じて、最初のアレイの使用されなくなったメモリ)。

C ++へようこそ。ここでは、エンジニアがリソースの管理を担当しています(多くのスクリプトやその他の「高級」言語とは異なります)。

補足:最初のコードが要素をシフトし、そのメモリブロックの最後に未使用の「テール」を残している間、2番目の例は、この配列に割り当てられたメモリブロックを超えるメモリにアクセスし、メモリアクセス違反(およびその他まともなOSによるプログラムの終了の可能性よりも)

于 2012-08-06T09:55:32.660 に答える
0

C ++を使用している場合は、標準テンプレートライブラリのコンテナを使用できます。コード例で使用する配列は、Cスタイルの配列です。C ++コードでCスタイルの配列を使用することは完全に許容されますが、配列の実行時のサイズ変更に関してはるかに柔軟性が高いため、たとえばstd::vectorを使用する方がはるかに優れています。ほとんどの場合、Cスタイルの配列とstd::vectorの間にはごくわずかなパフォーマンスの違いがあります。

于 2012-08-06T09:56:23.730 に答える
0

ベクトルを使用する

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template<typename T>
void print(const vector<T> &v){
    typename vector<T>::const_iterator it;
    for(it=v.begin(); it!=v.end(); ++it)
        cout << *it << ' ';
    cout << endl;
}

int main (){
    const int arr[] = {1, 2, 3, 4, 5};
    const int size = sizeof(arr)/sizeof(int);

    vector<int> v(&arr[0], &arr[size]);

    v.erase(v.begin() + 2);
    print(v);//1 2 4 5

    v.insert(v.begin()+2, 3);
    print(v);//1 2 3 4 5
    v.insert(v.begin()+2, 50);
    print(v);//1 2 50 3 4 5
}
于 2012-08-09T15:18:38.750 に答える