我有一张类似
的地图typedef std::map<int, std::set<float>> innerMap;
typedef std::map<long, innerMap> outerMap;
我想做以下事项:
我想擦除外部地图键的内部地图元素
2.然后我想删除外部地图密钥,如果它包含0个内部地图元素。
对于第一种情况,我编写了代码:
outerMap mapA;
//assuming this map contain an element
//longx is key in outer element, intx is key of inner element
std::map<int, std::set<float>>::const_iterator innerIter = mapA[longx].begin();
while (innerIter != mapA[longx].end())
{
if (innerIter->first == intx)
{
if (innerIter->second.size() == 0)
{
mapA[longx].erase(innerIter++);
}
break;
}
++innerIter;
}
我用C ++编写了这段代码,但我想使用C ++ 11。我们可以在C ++ 11中以更好的方式编写这个吗?
对于第二种情况,我是否需要再次迭代外部地图并检查其值元素,或者我可以在现有代码本身中执行此操作?
答案 0 :(得分:0)
您目前所做的事情(在C ++ 11中):
auto& inner = mapA[longx];
const auto it = inner.find(intx);
if (it != inner.end() && it->second.size() == 0) {
inner.erase(it);
}
答案 1 :(得分:0)
这段代码对我来说太复杂了。以下应该做同样的事情,不需要使用花哨的C ++ 11功能:
outerMap mapA;
// Lookup iterator for element of outerMap.
outerMap::iterator const outerIter = mapA.find(longx);
// Lookup iterator for element of innerMap that should be checked.
innerMap::const_iterator const innerIter = outerIter->second.find(intx);
// Check if element of innerMap should be erased and erase it if yes.
if(innerIter != outerIter->second.end() && innerIter->second.size() == 0) {
outerIter->second.erase(innerIter);
}
// Erase element of outer map is inner map is now empty:
// This should do scenario 2
if(outerIter->second.size() == 0) {
mapA.erase(outerIter);
}