如何在迭代时从地图中删除?喜欢:
std::map<K, V> map;
for(auto i : map)
if(needs_removing(i))
// remove it from the map
Run Code Online (Sandbox Code Playgroud)
如果我使用map.erase它将使迭代器无效
在下面的代码中,我遍历一个map并测试是否需要擦除一个元素.擦除元素并继续迭代是否安全,或者我是否需要在另一个容器中收集密钥并执行第二个循环来调用erase()?
map<string, SerialdMsg::SerialFunction_t>::iterator pm_it;
for (pm_it = port_map.begin(); pm_it != port_map.end(); pm_it++)
{
if (pm_it->second == delete_this_id) {
port_map.erase(pm_it->first);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个使用visual studio 2003构建的旧项目,最近我用vs2005重新编译了它.但是,在运行时,我收到以下错误:
列表迭代器不可递增
我跟踪程序到这个函数:
void InputQueue::update()
{
list<PCB>::iterator iter;
list<PCB>::iterator iterTemp;
for(iter = begin(); iter != end(); iter++)
{
if(iter->arrivalTime == 0)
{
ReadyQueue::getInstance()->add(*iter);
iterTemp = iter;
iter++;
erase(iterTemp);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不是C++专家,这就是VS调试器给我的.有人可以向我解释问题是什么吗?
谢谢
我正在将一个中型C++项目从Visual Studio 2005移植到MacOS,XCode/GCC 4.0.
我偶然发现的一个差异与从地图中删除元素有关.在Visual Studio中,我可以擦除迭代器指定的元素,并将返回值赋给迭代器以获取下一个元素的位置.这样,迭代器在擦除后不会指向某个无效地址.
换句话说,在Visual Studio中我可以这样做:
itor = m_ResourceMap.erase(itor);
在GCC 4.0中,擦除函数返回void,所以我不能这样做.这是否意味着以下映射元素向后移动,因此迭代器自动指向下一个元素,或者这是否意味着我必须在之后增加迭代器?该 在线文档STL是不是关于这个问题的非常简洁的XCode似乎并没有什么.
谢谢你的帮助,
阿德里安
我有对象的地图,我想迭代它并删除一些条目.
typedef std::map<A,B> MapT;
MapT m;
MapT::iterator it;
for(it = m.begin(); it != m.end(); it++ ) {
if( condition ) m.erase(it);
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?
我有一张地图map1<string,vector<string>>我有一个地图"itr"的迭代器.我想从这个地图中删除"itr"指向的条目.我可以使用map1.erase(itr)函数; 在此行之后,迭代器"itr"变为无效.根据我在项目中的要求,迭代器必须指向下一个元素.可以任何身体帮助我提前重新启动这个坦克:) santhosh
此方法导致中止错误:"map/set iterator not incrementable."
由于在if失败之后并且确定应该擦除的虚拟迭代器(并且是),继续到映射中的下一个迭代器++_iter失败,因为_iter它不再是有效的对象/指针.
迭代地图的正确程序是什么,并且能够在整个过程中删除单个项目?
typedef std::map<std::string, BITMAP*> MapStrBmp;
typedef MapStrBmp::iterator MapStrBmpIter;
\\...
void BitmapCache::CleanCache() {
//Clean the cache of any NULL bitmaps that were deleted by caller.
for(MapStrBmpIter _iter = _cache.begin(); _iter != _cache.end(); ++_iter) {
if(_iter->second != NULL) {
if((_iter->second->w < 0 && _iter->second->h < 0) == false) continue;
}
_cache.erase(_iter);
}
}
Run Code Online (Sandbox Code Playgroud)