たとえば、 python に配列がある場合arr = [1,3,4]
。arr.remove(element)
otを使用するだけで配列内の要素を削除できますarr.pop()
。リストは変化し、長さが変化し、その要素は存在しません。C や C++ でこれを行う方法はありますか? はいの場合、それを行う方法は?
4 に答える
std::vector
(または標準ライブラリ内の他のコンテナー)を探していると思います。
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;
}
C ++では、マイレージに基づいて使用するstd::list
か、ベースにすることができますstd::vector
で実装する必要がある場合はC
、二重リンク リストの実装を記述する必要があります。または、 をエミュレートしたくない場合は、 と を使用しstd::vector
て実行できます。memcpy
array indexing
私が理解しているように、標準ライブラリを使用したくない、または使用できません(ところで、なぜですか?)。
STL 実装の 1 つでベクター テンプレートのコードを調べて、それがどのように実装されているかを確認できます。
基本的なアルゴリズムは単純です。配列の途中から何かを削除する場合は、後で縮小する必要があります。真ん中に挿入する場合は、前に展開する必要があります。memcpy
たとえば、メモリの再割り当てと配列の移動が必要になる場合があります。
または、前述のように二重リンクリストを実装できます。ただし、配列のようには動作しません。