1. ホーム
  2. c++

[解決済み] 配列の要素を削除し、残りの要素をシフトする

2022-03-07 08:32:32

質問

配列の要素を削除して、残りの要素を下にずらすにはどうしたらよいでしょうか。つまり、配列があったとして

array[]={1,2,3,4,5} 

を削除し、残りをシフトしたいので、私は持っています。

array[]={1,2,4,5}

最小限のコードでこれを行うにはどうしたらよいでしょうか?

どのように解決するのですか?

削除するものを配列の次の値で上書きし、その変更を伝播させ、新しい終端がどこにあるかを覚えておくだけでよいのです。

int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

// delete 3 (index 2)
for (int i = 2; i < 8; ++i)
    array[i] = array[i + 1]; // copy next element left

これで配列は {1, 2, 4, 5, 6, 7, 8, 9, 9} . を削除することはできません。 9 これは静的なサイズの配列なので、無視するしかありません。これは std::copy :

std::copy(array + 3, // copy everything starting here
          array + 9, // and ending here, not including it,
          array + 2) // to this destination

C++11では std::move (アルゴリズムのオーバーロードで、ユーティリティのオーバーロードではありません)。

より一般的には std::remove を使用して、ある値にマッチする要素を削除します。

// remove *all* 3's, return new ending (remaining elements unspecified)
auto arrayEnd = std::remove(std::begin(array), std::end(array), 3);

さらに一般的には std::remove_if .

を使用することに注意してください。 std::vector<int> は、動的に割り当てられるサイズ変更可能な配列であるため、ここではより適切であると思われます。(つまり、その size() 削除された要素を反映させる)