为什么地图不插入?

时间:2019-12-13 16:35:04

标签: c++ dictionary insert iterator

为什么找不到膝部时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
   }
}

1 个答案:

答案 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>