我正在用 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/

10-12 19:00