2

コードに問題があり、誰かが見てくれるかどうか疑問に思っていました。配列から特定の要素を削除するために作成した関数があります。線形検索を使用して要素を見つけ、要素を具体的に削除する方法が見つからないため、削除したい要素を次の要素で上書きします。私の問題は、要素が上書きされないため、コードが実際には機能しないことです。また、要素が上書きされた後に配列に空白を残す方法もあります。

以下は私のコードです:

void deleteinfo()
{
    string search ;
    int found ;

    cout << "\n Delete A Player's Information \n\n" ;
    cout << "Please Enter The Player's Last Name : " ;
    cin >> search ;

    found=linsearch(search);

    if (found==-1)
    {
        cout << "\n There is no player called " << search ;
    }
    else
    {
        player[found].getFirstName() = player[found + 1].getFirstName() ;
        player[found].getLastName() = player[found + 1].getLastName() ;
        player[found].getAge() == player[found + 1].getAge() ;
        player[found].getCurrentTeam() = player[found + 1].getCurrentTeam() ;
        player[found].getPosition() = player[found + 1].getPosition() ;
        player[found].getStatus() = player[found + 1 ].getStatus() ;

        cout << "\n Player has been deleted." ;
    }

    cin.get() ;

    menu() ;
}


int linsearch(string val)
{
    for (int j=0; j <= 3; j++)
    {
        if  (player[j].getLastName()==val)
         return j ;         
    }
        return -1 ;
}
4

2 に答える 2

1

これは、この問題を解決する方法の一例にすぎません。静的な長さの配列 (プレイヤーの最大数) があると仮定しています。

Player *Players[MAX_PLAYERS];          //Array with pointers to Player objects.
for(int i = 0; i < MAX_PLAYERS; ++i)
    Players[i] = new Players(x, y, z); //Fills the array with some data.

今あなたの消去のために:

if(found > 0) {
    delete Players[found];             //Destroys the object in question.
    for(int i = found; i < MAX_PLAYERS - 1; ++i)
        Players[i] = Players[i + 1];   //Moves the entire list up by one.
    Players[MAX_PLAYERS - 1] = NULL;   //Marks the new end of the list.
}

この小さなスニペットは、オブジェクト全体を「コピー」するのではなく、オブジェクトを再構築せずに配列内で上に移動します。

最初の NULL ポインター (および最新の MAX_PLAYERS) に遭遇したとき、配列は「最後」にあり、「空白スペース」を占めます。または、「上に移動」を省略して、オブジェクトを破棄し、ポインターを NULL に設定することもできます。そうすれば、そこにプレーヤーがいないことがわかります。

于 2013-01-23T17:41:43.133 に答える
0

あなたがしなければならないことは、削除したい要素に続くすべての要素を1つの位置だけ左にコピーし、最後に配列の新しい長さを更新することです. 例えば:

for (size_t i = found + 1; i < player_length; ++i) {
    player[i - 1] = player[i];
}
--player_length;

player配列内のオブジェクトはコピー可能でなければなりません。配列の現在の長さを保持する変数がどこかにあると仮定します(「長さ」は、合計容量ではなく、現在含まれているプレーヤーの数です。)

于 2013-01-23T17:41:10.767 に答える