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