c ++地图问题

时间:2009-08-07 21:11:20

标签: c++

如果我有这样的地图:

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'?这可能吗?

3 个答案:

答案 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;
}