나는 다음과 같다 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++;
무엇이 잘못 되었나요?
[반복기 무효화 규칙] 가능한 중복 (http://stackoverflow.com/questions/6438086/iterator-invalidation-rules) – MikeCAT