0
私はベクトルのマップをC++で持っています。各ベクトルについて、私はある条件を満たすエントリーを削除したいと思う。ベクトルが空になったら、マップから削除したいと思います。私は、削除がイテレータを混乱させる可能性があることを知っています、そして、二重反復はこれを私にとってさらに混乱させます。これを達成する最良の方法は何ですか?削除中にベクトルのマップを反復処理する方法はありますか?
私はベクトルのマップをC++で持っています。各ベクトルについて、私はある条件を満たすエントリーを削除したいと思う。ベクトルが空になったら、マップから削除したいと思います。私は、削除がイテレータを混乱させる可能性があることを知っています、そして、二重反復はこれを私にとってさらに混乱させます。これを達成する最良の方法は何ですか?削除中にベクトルのマップを反復処理する方法はありますか?
標準変異コンテナループ:ここ
for (auto it = m.begin(); it != m.end();)
{
// work
if (/* need to delete */) // e.g "if (it->second.empty())"
{
it = m.erase(it);
}
else
{
++it;
}
}
は、それを行うことができる方法を示して実証プログラムで
#include <iostream>
#include <map>
#include <vector>
int main()
{
std::map<int, std::vector<int>> m =
{
{ 1, { 1, 2 } },
{ 2, { 2 } },
{ 3, { 3, 4 } },
{ 4, { 4 } }
};
for (const auto &p : m)
{
std::cout << p.first << ": ";
for (int x : p.second) std::cout << x << ' ';
std::cout << std::endl;
}
for (auto it = m.begin(); it != m.end();)
{
it->second.erase(it->second.begin());
if (it->second.empty()) it = m.erase(it);
else ++it;
}
std::cout << std::endl;
for (const auto &p : m)
{
std::cout << p.first << ": ";
for (int x : p.second) std::cout << x << ' ';
std::cout << std::endl;
}
return 0;
}
プログラム出力は
1: 1 2
2: 2
3: 3 4
4: 4
1: 2
3: 4
少しコードのためのものです文脈はここで助けになるだろう。 – tadman
一般的に言えば、あなたの試行を見せてもらうのは良いことです。あなたのコードの一部を含めずに質問を投稿するのはまれです。 –
これはhttp://stackoverflow.com/questions/8234779/how-to-remove-from-a-map-while-iterating-itの複製です – qexyn