gpt4 book ai didi

c++ - 对 map 容器使用remove_if

转载 作者:行者123 更新时间:2023-12-02 07:36:06 30 4
gpt4 key购买 nike

我试图对 map 容器使用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.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
]

最佳答案

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

这不适用于 map ,因为您无法覆盖 pair<key,value>元素批发:不允许修改键值,或者实现所需的排序顺序不变量可能会失效。

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

关于c++ - 对 map 容器使用remove_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29004092/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com