如何使用迭代器修改对象?使用<list> </list>

时间:2011-12-28 22:49:17

标签: c++ list iterator

所以这是一个例子。该星标mLocationmSpeedVector3自定义类型。

我试过了:

Star &star = *iStar;
Star star = *iStar;

直接使用iStar->对我的运营商不起作用,不确定原因。 那么这样做的正确方法是什么?

   void UniverseManager::ApplySpeedVector()
   { 
   std::list <Star>::const_iterator iStar;

       for (iStar = mStars.begin(); iStar != mStars.end(); ++iStar)
       {
           // how to I get a hold on the object the iterator is pointing to so I can modify its values
                   // i tried  Star &star = *iStar;  this is illegal
                   // tried just using the iStar->mLocation += iStar->mSpeed this also fails due to the operator not accepting the values not sure why
                   // tried other things as well, so what is the proper way to do this?

           iStar->SetLocationData( iStar->mLocation += iStar->mSpeed);
       }
   }

2 个答案:

答案 0 :(得分:9)

std::list<Star>::const_iterator iStar;

您无法通过const_iterator修改容器中的对象。如果要修改对象,则需要使用iterator(即std::list<Star>::iterator)。

答案 1 :(得分:3)

正如James告诉你的那样,你应该使用std::list<Star>::iterator,这样你就可以通过调用方法或访问其成员变量来修改对象。

这将是这样的:

void UniverseManager::ApplySpeedVector()
{
    std::list <Star>::iterator iStar;

    for (iStar = mStars.begin(); iStar != mStars.end(); ++iStar)
    {
        iStar->SetLocationData(iStar->mLocation += iStar->mSpeed);
    }
}

尽管如此,如果您想改进代码,您可能更愿意使用getter来访问位置和速度:

void UniverseManager::ApplySpeedVector()
{
    std::list <Star>::iterator iStar;

    for (iStar = mStars.begin(); iStar != mStars.end(); ++iStar)
    {
        iStar->SetLocationData(iStar->GetLocationData() + iStar->GetSpeed());
    }
}

在任何情况下,您都必须使用非const迭代器。