我使用几个std::map
类型的数据容器,其有以下几种:迭代和删除std :: map中的某些元素时出现分段错误?
std::map<int, std::vector<cv::Point> > mapGoodContours;
std::map<int, EllipseProperties> ellipsePropertiesMap;
std::map<int, float> m_markerRadiusMap;
std::map<int,cv::Point2f> markers;//This is part of another class
我通过这些容器迭代并删除一些元件后的那些元件满足一定条件如显示在下面的代码。
auto radiusMapCounter = m_markerRadiusMap.begin();
auto markerCounter = frames.markers.begin();
auto goodContoursCounter = mapGoodContours.begin();
if(m_markerRadiusMap.size()==ellipsePropertiesMap.size() && frames.markers.size()==ellipsePropertiesMap.size()
&& mapGoodContours.size()==ellipsePropertiesMap.size())
{
for(auto ellipsePropertyCounter = ellipsePropertiesMap.begin(); ellipsePropertyCounter != ellipsePropertiesMap.end(); ellipsePropertyCounter++)
{
float upperLimit = (float)m_upperFactor*(float)ellipsePropertyCounter->second.radius;
float lowerLimit = (float)m_lowerFactor*(float)ellipsePropertyCounter->second.radius;
if(ellipsePropertyCounter->second.minDistanceFromOtherEllipse>upperLimit
|| ellipsePropertyCounter->second.minDistanceFromOtherEllipse<lowerLimit)
{
ellipsePropertiesMap.erase(ellipsePropertyCounter);
m_markerRadiusMap.erase(radiusMapCounter);
frames.markers.erase(markerCounter);
mapGoodContours.erase(goodContoursCounter);
}
else
{
smallContours.push_back(goodContoursCounter->second);
}
radiusMapCounter++;
markerCounter++;
goodContoursCounter++;
}
}
我很困惑,发现有时我有像图中所示的分段错误。 故障具体指向代码行radiusMapCounter++;
我在做什么错?
[Iterator无效规则]的可能重复(http://stackoverflow.com/questions/6438086/iterator-invalidation-rules) – MikeCAT