为什么找不到膝部时UpdateLapMap不插入UapMap?
typedef std::map<int, int> UapMap; // map of uap counters
typedef std::map<int, UapMap> LapMap; // map of UapMaps
LapMap m_LapMap;
void MyClass::UpdateLapMap( int lap, int * uaps, size_t n_uaps )
{
std::map<int, UapMap>::iterator itLap = m_LapMap.find( lap );
if ( itLap == m_LapMap.end( ) )
{
printf( "not found - insert new lap %d\n", lap );
for ( size_t i = 0; i < n_uaps; i++ ) itLap->second[ uaps[ i ] ] = 1; // initial count
}
else
{
/// insert and/or increment uap counters
}
}
答案 0 :(得分:1)
您在itLap->second
时使用itLap == m_LapMap.end( )
。
std::map::end()
返回一个占位符元素,尝试访问它会调用未定义的行为。
UpdateLapMap
不会插入UapMap
,因为没有代码可插入UapMap
,因此您应该添加它。
例如:
if ( itLap == m_LapMap.end( ) )
{
printf( "not found - insert new lap %d\n", lap );
itLap = m_LapMap.insert( LapMap::value_type( lap, UapMap() ) ).first; // add this line
for ( size_t i = 0; i < n_uaps; i++ ) itLap->second[ uaps[ i ] ] = 1; // initial count
}
std::map::insert()
会返回一对指向插入元素的迭代器和一个布尔值,该布尔值指示是否已完成插入或键已经存在,因此该迭代器通过.first
获取。 / p>