14
11

More than 1 year has passed since last update.

【C++】vectorで要素を削除するときに使う関数

Posted at

C++のvectorを中心とするコンテナクラスで、要素を削除する際によく使う関数です。

pop_back関数

末尾の要素を削除する。

vector<int> vec = {1, 2, 3, 4};
vec.pop_back(); // {1, 2, 3}

erase関数

指定した要素を削除する。削除したい要素を指すイテレータを引数に指定する。

vector<int> vec = {1, 2, 3, 4};
vec.erase(vec.begin + 2); // {1, 2, 4}

イテレータで範囲を指定すると、連続した複数の要素も削除できる。

vector<int> vec = {1, 2, 3, 4, 5, 6};
vec.erase(vec.begin(), vec.begin() + 2); // {4, 5, 6}

erase関数で要素を削除すると、削除された要素より後ろにある要素は前に詰められる。
つまり、末尾のイテレータは更新されてコンテナサイズも小さくなる

remove関数

指定した要素を取り除く。
第一引数、第二引数でイテレータで範囲を指定して、第三引数に削除したい要素を指定する。
remove関数は取り除いた後の有効領域の末尾の次を指すイテレータを返すので、それを用いて続きの処理を行う。

vector<int> vec = {1, 0, 2, 0, 3, 0, 4, 0};
auto newEnd = remove(vec.begin(), vec.end(), 0);
for(auto it=vec.begin(); it != newEnd; ++it){
    cout << *it << " "; // 1 2 3 4
} 

注意点として、erase関数と異なり、要素を取り除いた後の無効領域は残ったままになる。
つまり、コンテナサイズ自体は変わらないので、戻り値を使用せずにend関数や範囲for文を使用する際は注意が必要になる。

unique関数

連続した重複する要素を削除する。
unique関数も、remove関数と同様に削除した後の有効領域の末尾の次を指すイテレータを返すので、それを用いて続きの処理を行う。

vector<int> vec = {1, 2, 2, 2, 3, 4};
auto newEnd = unique(vec.begin(), vec.end());
for(auto it=vec.begin(); it != newEnd; ++it){
    cout << *it << " "; // 1 2 3 4
} 

注意点として、remove関数と同様に、要素を取り除いた後の無効領域は残ったままでコンテナサイズ自体は変わらない。
戻り値を用いずに、end関数や範囲for文を使用する際は注意が必要になる。

clear関数

全要素を削除する。

vector<int> vec = {1, 2, 3, 4};
vec.clear(); // {}
14
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11