2009-08-07 54 views
1

如果我有一个图是这样的: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”?这可能吗?

回答

6

当然,使用迭代器:如果你希望可以有多个“B公司在矢量

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); 
    } 
} 
+0

+1虽然我可能会改变“B”到“B” :) – SwDevMan81 2009-08-07 21:22:42

+0

这给了我一个错误没有发现标识未发现 – 2009-08-07 21:25:51

+0

原来的问题既有“B”和“b”,和具体的“B '作为要删除的项目。没有更多的细节,我主要是猜测。 – 2009-08-07 21:26:54

1

,我会写这样。

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()); 
} 
+0

我不认为'std :: remove()'在地图上工作,因为它们的'value_type'是一个(部分)'const'对象,而IIRC,'std :: remove()'要求它是可分配的。 – sbi 2009-08-07 22:24:39

+0

是不是杰克试图删除矢量中的'b'?我在vector上调用std :: remove(i-> second)而不是地图。 – Kei 2009-08-07 23:05:55

+0

@Kei:恩,对不起这个脑袋。 '' – sbi 2009-08-08 11:33:23

0

我只在这里复制别人的算法,但我发现,如果没有一对夫妇明智的typedef和临时参考变量的超长线可以显著的可读性变得。

原始问题未完全指定所需的行为,但如果向量为空,则可能需要删除映射条目。这可以作为地图迭代器的一部分来完成,或者作为最后的通过来完成。

也可能想要删除第一个包含'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; 
}