加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用remove_if作为地图容器

发布时间:2020-12-16 09:56:54 所属栏目:百科 来源:网络整理
导读:我试图使用remove_if模板的地图容器,但我得到模板参数的编译器错误.我无法理解为什么. int main(){ mapconst int,int intmap; intmap[1] = 1; intmap[2] = 2; intmap[3] = 3; intmap[4] = 4; auto isOdd = [](pairconst int,int it)-bool { return static_ca
我试图使用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); 
}

这个remove_if正在抛出编译器错误.有什么建议可以解决吗?

错误信息是

C:Program Files (x86)Microsoft Visual Studio 10.0VCINCLUDEutility(260) : error C2166: l-value specifies const object
        C:Program Files (x86)Microsoft Visual Studio 10.0VCINCLUDEutility(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
        ]

解决方法

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

这不适用于地图,因为您无法覆盖该对< key,value> elements wholesale:不允许修改键值,或者实现需要的排序顺序不变可能无效.

所以,你需要放弃remove_if.您可以使用普通循环,小心保存迭代器到下一个元素,而不是尝试从刚刚擦除的迭代器前进.关于如何在迭代时从地图中擦除元素的许多其他问题,例如,here ….

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读