为什么 std::multimap 的元素在退出此代码中的循环后会发生变化?

Rom*_*huk 3 c++ stl

我正在尝试在我的 OpenGL 程序中实现透明度。目前我有这样的功能(最小的可重现示例):

#include <map>
#include <unordered_map>
#include <iostream>
#include <vector>

class Sprite
{
public:
    std::vector<int> m_meshes;
    std::pair<float, float> pos;
};

int main()
{
    std::unordered_map<int, Sprite> m_sprites = {
        { 0, { { 43 } } },
        { 1, { { 234 } } }
    };

    std::multimap<int, const Sprite*, std::greater<int>> translucentSprites{};
    for (const std::pair<int, Sprite>& spritePair : m_sprites)
    {
        translucentSprites.insert({ spritePair.second.pos.first + spritePair.second.pos.second, &spritePair.second});
        std::cout << translucentSprites.begin()->second->m_meshes.size() << ' ';
    }
    std::cout << translucentSprites.begin()->second->m_meshes.size() << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行此代码后,我得到以下结果:

1 1 0
Run Code Online (Sandbox Code Playgroud)

前两个数字是 1,但第三个数字由于某种原因是 0,而不是 1。我尝试使用调试器,但没有帮助。我在这里犯了什么错误?

Ted*_*gmo 5

const std::pair<int, Sprite>& spritePair超出范围时(在每次迭代中),的副本Sprite将消失并且指针将悬空。

你可以通过制作来修复它

const std::pair<const int, Sprite>& spritePair
Run Code Online (Sandbox Code Playgroud)

然后,它将引用pair地图中的实际值,而不是创建std::pair<int, Sprite>通过转换。

另一种修复方法是使用结构化绑定:

const std::pair<const int, Sprite>& spritePair
Run Code Online (Sandbox Code Playgroud)

可以使用以下简化方法emplace来代替insert

for (const auto& [idx, sprite] : m_sprites) {
    translucentSprites.insert({sprite.pos.first + sprite.pos.second, &sprite});
Run Code Online (Sandbox Code Playgroud)