将remove_if用于地图容器
using remove_if for a map container
我试图将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()
。
这不适用于map
,因为你不能完全覆盖pair<key,value>
元素:不允许修改键值,或者实现所需的排序顺序不变性可能失效。
所以,你需要放弃remove_if
. 您可以使用普通循环,小心保存迭代器到下一个元素,而不是尝试从刚刚擦除的迭代器前进。 关于如何在迭代时从地图中删除元素的许多其他问题,例如这里......
这个erase_if
模板化的小函数应该可以做你想做的事。(我没有写它,只是从某个地方捡起它 - 所以要归功于谁!
template< typename ContainerT, typename PredicateT >
void erase_if( ContainerT& items, const PredicateT& predicate ) {
for( auto it = items.begin(); it != items.end(); ) {
if( predicate(*it) ) it = items.erase(it);
else ++it;
}
};
在您的示例中,您将像这样使用它:
erase_if(intmap, isOdd);
你不能
在map
上使用remove_if
,因为它的值类型实际上是std::pair<const Key, Value>
的,但是你看看remove_if的要求,你可以看到,取消引用的迭代器类型应该是MoveAssignable
的。
只需编写循环,或使用 boost 例如。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 为什么不;名字在地图上是按顺序排列的吗
- 重载操作程序时出错>>用于类中的字符串 memebr
- 基于多个条件处理地图中的所有元素
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 用于接收通用地图作为参数的模板函数
- 为什么我们没有用于地图的哈希和捕食函子?
- GLM超载操作员用于地图不起作用
- 为什么通用参考概念不适用于函数指针的地图插入
- 少的专业化<>适用于地图但不适用于排序
- 用于uint16_t uint16_t地图的最有效容器
- 用于地图C++的哈希函数
- 这个用于地图的参考计数内存管理器的概念好吗?
- 将remove_if用于地图容器
- 如何使用地图或矢量进行C++记忆,用于任意数量的输入
- 编写用于游戏开发的地图编辑器
- 对象的比较器运算符,用于将其存储在地图中
- QML和一种适用于Windows的地图/定位技术的集成