擦除嵌套的地图元素

时间:2015-08-07 11:20:05

标签: c++ c++11 stdmap

我有一张类似

的地图
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中以更好的方式编写这个吗?

对于第二种情况,我是否需要再次迭代外部地图并检查其值元素,或者我可以在现有代码本身中执行此操作?

2 个答案:

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