0

我有一个包含与精灵关联的字符串的地图。此函数用于返回要在屏幕上绘制的精灵。这是功能:

sf::Sprite LoopSprite()
{
    for (std::map<std::string,sf::Sprite>::iterator it=SpriteMap.begin(); it!=SpriteMap.end(); ++it)
    {
       return it->second;
    }
}

我曾经将它们放在一个矢量中,这使得绘制循环变得容易,但我想使用一个地图来更容易识别以维护代码。上面的函数只允许从地图中绘制一张图像。这个功能有问题吗?

sf::Sprite LoopSprite(int element)
{
    return vec[element];
}

正如所指出的,这是有效的,因为它需要一个元素,所以只有一个返回,但我想要相同的结果,除了地图。问题是发送 0-vec.size 很容易。我唯一的想法是拥有一个字符串向量以允许轻松循环。

4

2 回答 2

1

您的函数将简单地return在第一次迭代中,仅返回地图中的第一个元素。

您在评论中说,最初,当您使用向量时,该函数接受一个int参数并返回该元素。如果你仍然想要这个功能,你可以用这样的地图来实现同样的功能:

sf::Sprite LoopSprite(std::string key)
{
    return SpriteMap[key];
}

如果您想遍历内部地图的元素LoopSprite,那么您需要将实际上对每个元素执行某些操作的代码行移动到函数中:

void LoopSprite()
{
    for (std::map<std::string,sf::Sprite>::iterator it=SpriteMap.begin(); it!=SpriteMap.end(); ++it)
    {
       // Do something with it->second
    }
}
于 2013-04-05T18:42:11.703 回答
1

首先,您要返回不允许的局部变量。即使从函数返回后,它也可能为 null 或无效。

您只返回SpriteMap.begin()实际上无用的这部分。这段代码要容易得多。

sf::Sprite LoopSprite(string key)
{
    std::map<std::string,sf::Sprite>::iterator it = SpriteMap.begin();

    while(it!=SpriteMap.end())
    {
       if(check) // check if this is your desired key
           return value;
       ++it;
    }
    return null;
}

map 通常以简单的方式使用:

string key = "keyItem";    
sf::Sprite ans = SpriteMap[key];
于 2013-04-05T19:01:07.867 回答