使用remove_if作为地图容器

Awa*_*ara 4 c++ stl remove-if

我试图将remove_if模板用于地图容器,但我收到模板参数的编译器错误。我不明白为什么。

int main()
{
  map<const int, int> intmap;

  intmap[1] = 1;
  intmap[2] = 2;
  intmap[3] = 3;
  intmap[4] = 4;

  auto isOdd = [&](pair<const int, int> it)->bool 
     { return static_cast<bool>(it.second % 2); };

  isOdd(*(intmap.begin()));

 remove_if(intmap.begin(), intmap.end(), isOdd); 
}
Run Code Online (Sandbox Code Playgroud)

此remove_if引发编译器错误。有什么建议可以解决吗?

错误消息是

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\utility(260) : error C2166: l-value specifies const object
        C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\utility(259) : while compiling class template member function 
        'std::pair<_Ty1,_Ty2> &std::pair<_Ty1,_Ty2>::operator =(std::pair<_Ty1,_Ty2> &&)'
        with
        [
            _Ty1=const int,
            _Ty2=int
        ]
        maperaseif.cpp(29) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
        with
        [
            _Ty1=const int,
            _Ty2=int
        ]
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 5

remove_if通过扫描元素来工作,一旦元素被删除,它便会记住要保留的“间隙”(保持迭代器指向该间隙),同时推进另一个迭代器以查找要保留的下一个元素...然后开始复制或移动从后一个位置到前一个位置直到到达的元素end()

这不适用于map,因为您不能pair<key,value>批量覆盖元素:不允许修改键值,或者实现需求的排序不变。

因此,您需要放弃remove_if。您可以使用普通循环,请小心将迭代器保存到下一个元素,而不要尝试从刚刚擦除的迭代器进行升级。还有很多其他有关如何在迭代时从地图上删除元素的问题,例如这里 ...。