我在C ++中有一个矢量图。对于每个向量,我想删除满足特定条件的条目。如果向量结束为空,我想将其从地图中删除。我知道删除可能会破坏迭代器,而双重迭代会让我更加困惑。最好的方法是什么?
答案 0 :(得分:4)
标准变异容器循环:
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;
}
}
答案 1 :(得分:0)
这是一个演示程序,展示了如何完成
#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