hageking
@hageking

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

c++でmapのeraseを使いたい

Q&A

Closed

解決したいこと

mapのkeyを全て取得し、条件に合ったものだけerase関数で削除するプログラムを作りました。
実行すると実行時エラーが出ます。
解決方法を教えてください。

発生しているエラー

zsh: segmentation fault  ./a.out

コード

#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;

int main()
{
    std::map<string, std::vector<string>> map{
        {"1", {"11"}},
        {"2", {"22"}},
        {"3", {"33"}}};

    // mapの全てのkeyを取得
    for (auto i = map.begin(); i != map.end(); i++)
    {
        // ここに色々処理がある
        if (true)
        {
            map.erase(i->first);
        }
    }

    // 全て表示
    for (auto const &[k, v] : map)
        printf("(%d,%d)\n", k, v[0]);

    return 0;
}
0

1Answer

map.erase(i->first);を実行した時点で、iが指す先が削除されてi自体が無効になります。無効となったiに対してi++をしようとしたので実行時エラーとなっています。

ループ中で要素を削除したい場合は、以下のように書きましょう。

    // mapの全てのkeyを取得
    for (auto i = map.begin(); i != map.end();)
    {
        // ここに色々処理がある
        if (true)
        {
            i = map.erase(i);
        }
        else
        {
            i++;
        }
    }

参考:
https://cpprefjp.github.io/reference/map/map/erase.html

2Like

Comments

  1. @hageking

    Questioner

    ありがとうございます。
    解決しました。
    これからはサイトをちゃんと全部用読むようにします。

Your answer might help someone💌