stl map遍历删除的方法


	      ros::Time time = ros::Time::now();
        clearing_observations_map_.insert(std::pair<ros::Time, std::vector<costmap_2d::Observation> >(time, clearing_observations));
        min_x_.push_back(*min_x); //list
        min_y_.push_back(*min_y);
        max_x_.push_back(*max_x);
        max_y_.push_back(*max_y);
        ROS_ERROR("map: %ld,min_x_: %ld,min_y_: %ld,max_x_: %ld,max_y_: %ld", clearing_observations_map_.size(), min_x_.size(), min_y_.size(), max_x_.size(), max_y_.size());
              for (std::map<ros::Time, std::vector<costmap_2d::Observation> >::iterator iter = clearing_observations_map_.begin(); iter != clearing_observations_map_.end();)
	      {
			if (ros::Time::now() - iter->first >= ros::Duration(clearing_cycle_time_))
			{
				std::vector<Observation> temp = iter->second;
				double minx = min_x_.front();
				double miny = min_y_.front();
				double maxx = max_x_.front();
				double maxy = max_y_.front();

				for (unsigned int i = 0; i < temp.size(); ++i)
				{
					raytraceFreespace(temp[i], &minx, &miny, &maxx, &maxy);
					//ROS_ERROR("origin_: %f", temp[i].origin_.x);
				}
				clearing_observations_map_.erase(iter++);
				min_x_.pop_front();
				min_y_.pop_front();
				max_x_.pop_front();
				max_y_.pop_front();

				ROS_ERROR("map: %ld,min_x_: %ld,min_y_: %ld,max_x_: %ld,max_y_: %ld\n", clearing_observations_map_.size(), min_x_.size(), min_y_.size(), max_x_.size(), max_y_.size());

			}
			else
			{
				iter++;
			}


	        }
	
这种删除方式也是STL源码一书中推荐的方式,分析 mapt.erase(iter++)语句,map中在删除iter的时候,先将iter做缓存,然后执行iter++使之指向下一个结点,再进入erase函数体中执行删除操作,删除时使用的iter就是缓存下来的iter(也就是当前iter(做了加操作之后的iter)所指向结点的上一个结点)。
     根据以上分析,可以看出map.erase(iter++)和map.erase(iter); iter++;这个执行序列是不相同的。前者在erase执行前进行了加操作,在iter被删除(失效)前进行了加操作,是安全的;后者是在erase执行后才进行加操作,而此时iter已经被删除(当前的迭代器已经失效了),对一个已经失效的迭代器进行加操作,行为是不可预期的,这种写法势必会导致 map操作的失败并引起进程的异常。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值