如果我有这样的地图:
std::map<char, std::vector<char> > m;
m['A'].push_back('a');
m['A'].push_back('b');
m['A'].push_back('c');
m['B'].push_back('h');
m['B'].push_back('f');
我如何找到并删除'b'?这可能吗?
答案 0 :(得分:6)
当然,使用迭代器:
for (std::map<char, std::vector<char> >::iterator i = m.begin(); i != m.end(); ++i) {
std::vector<char>::iterator j = std::find(i->second.begin(), i->second.end(), 'b');
if (j != i->second.end()) {
i->second.erase(j);
}
}
答案 1 :(得分:1)
如果你期望向量中可以有多个'b',我会这样写。
for (std::map<char, std::vector<char> >::iterator i = m.begin(); i != m.end(); ++i) {
i->second.erase(std::remove(i->second.begin(), i->second.end(), 'b'), i->second.end());
}
答案 2 :(得分:0)
我只是在这里复制其他人的算法,但我发现如果没有一些明智的typedef和临时引用变量,额外的长行可能会变得更不易读。
原始问题未完全指定所需行为,但如果向量为空,则删除映射条目可能是合适的。这可以作为map迭代器的一部分完成,也可以作为最后的传递来完成。
也可能想要删除包含'b'的第一个向量中的第一个'b',或者在每个向量中删除所有'b',或者某个组合。
删除地图中所有矢量中的所有“b”。
typedef std::map<char, std::vector<char> > MapVecChar;
for( MapVecChar::iterator i = m.begin(); i != m.end(); ++i )
{
std::vector<char> &v = i->second;
v.erase( std::remove( v.begin(), v.end(), 'b' ), v.end() );
}
删除地图中矢量中找到的第一个“b”。
typedef std::map<char, std::vector<char> > MapVecChar;
for( MapVecChar::iterator i = m.begin(); i != m.end(); ++i )
{
std::vector<char> &v = i->second;
std::vector<char>::iterator j( std::find( v.begin(), v.end(), 'b' ) );
if( j != v.end() )
{
v.erase( j );
break;
}
}
删除空地图条目。
for( MapVecChar::iterator i = m.begin(); i != m.end(); )
{
if( i->second.empty() )
m.erase( i++ );
else
++i;
}