最終更新日時(UTC):
が更新

履歴 編集

function
<map>

std::map::erase

void erase(iterator position);                             // (1) C++03
iterator erase(const_iterator position);                   // (1) C++11

size_type erase(const key_type& x);                        // (2)

void erase(iterator first, iterator last);                 // (3) C++03
iterator erase(const_iterator first, const_iterator last); // (3) C++11

概要

単一要素または要素範囲([first, last))を map コンテナから削除する。

これは削除された要素の数だけコンテナの size を減らし、それぞれの要素のデストラクタを呼び出す。

パラメータ

  • position : map から削除する単一要素を指すイテレータ。iterator はメンバ型であり、双方向イテレータとして定義される。
  • x : map から削除される値のキー。key_type はメンバ型であり、map コンテナの中で Key の別名として定義される。ここで Key は 1 番目のテンプレートパラメータであり、コンテナに格納される要素のキーの型である。
  • first, last : map コンテナ内の、削除される範囲 [first, last) を指定するイテレータ。ここでいう範囲は firstlast の間の全ての要素を含み、first が指す要素を含むが last が指す要素は含まない。

戻り値

  • (1), (3)
    • C++03 : 戻り値なし
    • C++11 : 削除された要素の次を指すイテレータを返す。そのような要素がない場合、end()を返す(コンテナが空になった場合や、最後尾の要素を削除した場合)。
  • (2) 削除された要素の数を返す。

計算量

  • (1) 定数時間。
  • (2) コンテナの size() について対数時間。
  • (3) コンテナの size() について対数時間、それに加えて firstlast の間の距離に対する線形時間。

備考

  • ループ中で map の要素を削除するためには、C++03 までは以下のようなコードを書く必要があった。

    while (it != map_object.end()) {
      if (条件) {
        map_object.erase(it++);
      }
      else {
        ++it;
      }
    }
    

    • これは、erase で指定したイテレータが、対象となる要素が削除されることによって無効になるため、後置インクリメント it++ を使用することで要素が削除されるより先に削除対象の次の要素を指すようにするためである。
    • このような書き方は C++11 以降でも依然として有効だが、erase が削除された次の要素を指すイテレータを返すようになったため、以下のようなコードを

    map_object.erase(it++);
    

    • 以下のように書くこともできるようになった

    it = map_object.erase(it);
    

基本的な使い方 (C++03)

#include <iostream>
#include <map>

int main()
{
  std::map<int, char> m;

  m.insert(std::make_pair(1,'A'));
  m.insert(std::make_pair(2,'B'));
  m.insert(std::make_pair(3,'C'));
  std::cout << m.size() << std::endl;

  m.erase(1);
  std::cout << m.size() << std::endl;

  m.erase(5);
  std::cout << m.size() << std::endl;

  m.erase(m.begin(), m.end());
  std::cout << m.size() << std::endl;

  return 0;
}

出力

3
2
2
0

イテレート中に要素を削除する (C++11)

#include <iostream>
#include <map>

int main()
{
  std::map<int, char> m = {
    {3, 'a'},
    {1, 'b'},
    {4, 'c'}
  };

  // イテレート中に要素削除をするような場合には、
  // 範囲for文は使用できない
  for (auto it = m.begin(); it != m.end();) {
    // 条件一致した要素を削除する
    if (it->first == 1) {
      // 削除された要素の次を指すイテレータが返される。
      // C++03では、erase()の戻り値を使用せず、 m.erase(it++); のように書く
      it = m.erase(it);
    }
    // 要素削除をしない場合に、イテレータを進める
    else {
      ++it;
    }
  }

  for (const auto& x : m) {
    std::cout << x.first << ':' << x.second << std::endl;
  }
}

出力

3:a
4:c

バージョン

言語

  • C++11

処理系

関連項目

名前 説明
map::clear 全ての要素を削除する
map::insert 要素を挿入する
map::find 指定したキーで要素を探す

参照