iterator erase(iterator position); // (1) C++03
iterator erase(const_iterator position); // (1) C++11
constexpr iterator erase(const_iterator position); // (1) C++20
iterator erase(iterator first, iterator last); // (2) C++03
iterator erase(const_iterator first,
const_iterator last); // (2) C++11
constexpr iterator erase(const_iterator first,
const_iterator last); // (2) C++20
概要
指定した要素を削除する。
要件
T
はMoveAssignableでなければならない。
効果
- (1) :
position
が指す要素が削除される。 - (2) :
[first, last)
で示されるイテレータ範囲の要素が削除される。
削除された要素またはそれ以降の要素を指すイテレータや参照は無効になる。
戻り値
削除された要素の次の要素を指すイテレータを返す。そのような要素が存在しない場合は、end()
を返す。さらに、削除された要素以降の要素の数と同じ回数のT
のムーブ代入演算子が呼ばれる。
計算量
削除される要素の数と同じ回数のT
のデストラクタが実行される。
備考
コピーコンストラクタ、ムーブコンストラクタ、代入演算子、ムーブ代入演算子が例外を投げる場合を除いて、この関数は例外を投げない。
例
基本的な使い方 (C++11)
#include <iostream>
#include <vector>
void print(const char* name, const std::vector<int>& v)
{
std::cout << name << " : {";
bool first = true;
for (int x : v) {
if (first) {
first = false;
}
else {
std::cout << ", ";
}
std::cout << x;
}
std::cout << "}" << std::endl;
}
int main()
{
// (1)
{
std::vector<int> v = {1, 2, 3, 4, 5};
// 2番目の単一要素(値3)を削除
v.erase(v.begin() + 2);
print("(1)", v);
}
// (2)
{
std::vector<int> v = {1, 2, 3, 4, 5};
// 範囲[v.begin(), v.begin() + 2)の要素を削除
v.erase(v.begin(), v.begin() + 2);
print("(2)", v);
}
}
xxxxxxxxxx
#include <iostream>
#include <vector>
void print(const char* name, const std::vector<int>& v)
{
std::cout << name << " : {";
bool first = true;
for (int x : v) {
if (first) {
first = false;
}
else {
std::cout << ", ";
}
std::cout << x;
}
出力
(1) : {1, 2, 4, 5}
(2) : {3, 4, 5}
イテレート中に要素を削除する (C++11)
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = {3, 1, 4};
// イテレート中に要素削除をするような場合には、
// 範囲for文は使用できない
for (auto it = v.begin(); it != v.end();) {
// 条件一致した要素を削除する
if (*it == 1) {
// 削除された要素の次を指すイテレータが返される。
it = v.erase(it);
}
// 要素削除をしない場合に、イテレータを進める
else {
++it;
}
}
for (const auto& x : v) {
std::cout << x << std::endl;
}
}
xxxxxxxxxx
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = {3, 1, 4};
// イテレート中に要素削除をするような場合には、
// 範囲for文は使用できない
for (auto it = v.begin(); it != v.end();) {
// 条件一致した要素を削除する
if (*it == 1) {
// 削除された要素の次を指すイテレータが返される。
it = v.erase(it);
}
// 要素削除をしない場合に、イテレータを進める
else {
++it;
}
}
for (const auto& x : v) {
std::cout << x << std::endl;
}
}
出力
3
4