插入特定数据结构时,我做错了什么?

时间:2018-03-25 01:34:24

标签: c++ insert containers sdl-2 stdmap

我正在使用SDL2库来创建游戏。我将加载的 SDL_Textures 存储到此地图容器中:

std::map<const SDL_Texture, std::vector<int[3]>> textures;

地图的 SDL_Texture 本身。 x,y,z 坐标的矢量,用于表示渲染纹理的所有位置。

当我尝试在结构中插入 std :: pair 时,我遇到了问题,如下所示:

textures.insert(
    std::pair<const SDL_Texture, std::vector<int[3]>>( 
       SDL_CreateTextureFromSurface(renderer, s), 
       std::vector<int[3]>()
    )
);

渲染器 SDL_Renderer s SDL_Surface 。 IDE( Visual Studio 2017 )将其标记为不正确:

no instance of constructor "std::pair<_Ty1,_Ty2>::pair 
[with _ty1=const SDL_Texture, _Ty2=std::vector<int[3],std::allocator<int[3]>>]" 
matches the argument list argument types are: 
(SDL_Texture*, std::vector<int[3],std::allocator<int[3]>>)

它显然不知道如何构建 std :: pair ,但我不知道为什么因为我能够在中构建一个 / strong>循环没有错误:

for (std::pair<const SDL_Texture, std::vector<int[3]>> tex : textures) {
}

我认为这与我未插入的未初始化的 std :: vector 有关。这是什么原因?如果是这样,有解决方法吗?如果没有,那可能是什么错误?

另外,有没有更好的方法来做我想做的事情?我正在寻求速度。

1 个答案:

答案 0 :(得分:1)

查看SDL_CreateTextureFromSurface的声明:

SDL_Texture* SDL_CreateTextureFromSurface(/* arguments omitted for brevity */)

特别注意返回类型。它是SDL_Texture*。这意味着指向SDL_Texture指针。

接下来,请查看地图的密钥类型:SDL_Texture。这与SDL_Texture*不同。指针(通常)不能隐式转换为其指向类型。

你不应该制作SDL_Texture的副本。最简单的解决方案是存储SDL_CreateTextureFromSurface返回的指针:

std::map<SDL_Texture*, std::vector<int[3]>> textures;

当您不再需要使用SDL_DestroyTexture的纹理时,这将允许您稍后释放已分配的资源。