0

たとえば、 python に配列がある場合arr = [1,3,4]arr.remove(element)otを使用するだけで配列内の要素を削除できますarr.pop()。リストは変化し、長さが変化し、その要素は存在しません。C や C++ でこれを行う方法はありますか? はいの場合、それを行う方法は?

4

4 に答える 4

5

std::vector(または標準ライブラリ内の他のコンテナー)を探していると思います。

于 2013-01-16T10:06:09.083 に答える
1

C の配列は単なるポインターであり、長さに関する情報は含まれていません。したがって、C プログラマーはポインターだけでなく、その長さも保持する必要があります。「C配列」から特定の値を消去するためのスニペットを次に示します

/// \return a new length
int removeFromArray( int * array, int arrayLength, int elementToRemove ) {
    int i;
    for ( i = 0; i < arrayLength; i++ ) {
        if ( array[ i ] == elementToRemove ) {
            memmove( & array[ i ], & array[ i + 1 ], arrayLength - i - 1 );
            return arrayLength - 1;
        }
    }
    return arrayLength;
}
于 2013-01-16T10:16:58.310 に答える
0

C ++では、マイレージに基づいて使用するstd::listか、ベースにすることができますstd::vector

で実装する必要がある場合はC、二重リンク リストの実装を記述する必要があります。または、 をエミュレートしたくない場合は、 と を使用しstd::vectorて実行できます。memcpyarray indexing

于 2013-01-16T10:13:38.653 に答える
0

私が理解しているように、標準ライブラリを使用したくない、または使用できません(ところで、なぜですか?)。

STL 実装の 1 つでベクター テンプレートのコードを調べて、それがどのように実装されているかを確認できます。

基本的なアルゴリズムは単純です。配列の途中から何かを削除する場合は、後で縮小する必要があります。真ん中に挿入する場合は、前に展開する必要があります。memcpyたとえば、メモリの再割り当てと配列の移動が必要になる場合があります。

または、前述のように二重リンクリストを実装できます。ただし、配列のようには動作しません。

于 2013-01-16T10:16:32.957 に答える