如果我有一个图是这样的: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”?这可能吗?
如果我有一个图是这样的: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”?这可能吗?
当然,使用迭代器:如果你希望可以有多个“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);
}
}
,我会写这样。
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());
}
我只在这里复制别人的算法,但我发现,如果没有一对夫妇明智的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;
}
+1虽然我可能会改变“B”到“B” :) – SwDevMan81 2009-08-07 21:22:42
这给了我一个错误没有发现标识未发现 – 2009-08-07 21:25:51
原来的问题既有“B”和“b”,和具体的“B '作为要删除的项目。没有更多的细节,我主要是猜测。 – 2009-08-07 21:26:54