返回map循环的问题

时间:2013-04-05 18:30:37

标签: c++ for-loop iterator stdmap

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

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。我唯一的想法是有一个字符串向量,以便轻松循环。

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分: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;
}

地图通常以简单的方式使用:

string key = "keyItem";    
sf::Sprite ans = SpriteMap[key];