我正在用 SFML 和 C++ 11 做这个简单的教程。我正在教 map 容器。我有c#知识,我的理解是map和字典一样。我的问题是关于他提供但没有很好解释的代码片段。
TextureHolder.h
std::map<std::string, sf::Texture> m_textures;
TextureHolder.cpp
sf::Texture& TextureHolder::GetTexture(std::string const& filename)
{
auto& r_textures = m_s_instance -> m_textures;
auto keyValuePair = r_textures.find(filename);
if (keyValuePair != r_textures.end())
{
return keyValuePair->second;
}
else
{
auto& texture = r_textures[filename];
texture.loadFromFile(filename);
return texture;
}
}
我理解除了 else 语句之外的所有内容。这是我对正在发生的事情的理解,但如果有人能向我澄清实际发生的事情以及我为什么会出错,我将不胜感激。
auto& texture = r_textures[filename]
这将使用文件名的键创建一个新的键值对。然后将值分配给纹理,这是一个空值,因为尚未加载纹理。texture.loadFromFile(filename);
这会加载一个纹理文件并将其分配给纹理。这是我完全迷失的地方。这条线也以某种方式将纹理添加到键的值中。然后它将纹理返回给调用函数。
这可能更多是对SFML如何处理纹理对象的误解,但我仍然对这条线如何与 map 中的键值对进行通信感到困惑。
最佳答案
不完全正确。 texture
是一个引用。它本身并不是一个谨慎的对象。
这将创建一个新的键/值对,并将引用 texture
设置为引用映射中新创建的值。
随后的 loadFromFile()
通过 loadFromFile()
引用调用 texture
方法。这恰好是指 map 中新插入的值。
然后,返回对从文件中新加载的值的引用。
胶囊摘要:它搜索 map 以查看是否找到键,如果找到,则返回对键值的引用。否则,它会为该键创建一个新的键/值对,初始化新值并返回它。
关于c++ - 了解如何使用 SFML 函数向 map 添加数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41559116/