C++ 将对象存储在c+中的二维sprite矩阵中+;

C++ 将对象存储在c+中的二维sprite矩阵中+;,c++,matrix,vector,C++,Matrix,Vector,我想在二维向量中存储一个tile列表(指向“Sprite”类对象的指针) 目前,我正在将tilemap中的所有精灵存储在一个向量中 std::vector<Sprite*> _tiles; std::vector\u tiles; 现在我需要得到所有相邻的瓷砖,我认为这更容易,将我的精灵存储在2d矩阵中(向量中的向量)来进行这些计算 但我不知道该怎么做 标题: private: std::vector<std::vector<Sprite*>> mat

我想在二维向量中存储一个tile列表(指向“Sprite”类对象的指针)

目前,我正在将tilemap中的所有精灵存储在一个向量中

std::vector<Sprite*> _tiles;
std::vector\u tiles;
现在我需要得到所有相邻的瓷砖,我认为这更容易,将我的精灵存储在2d矩阵中(向量中的向量)来进行这些计算

但我不知道该怎么做

标题:

private:
  std::vector<std::vector<Sprite*>> matrix;
private:
向量矩阵;
C++文件:

vectorMatrix::vectorMatrix(int columns, int rows) { }

vectorMatrix::~vectorMatrix() { } 


void vectorMatrix::addCellAt(int x, int y, Sprite* sprite) {
  std::vector< std::vector<Sprite*> > matrix;
  matrix[x][y].push_back(sprite);
}
vectorMatrix::vectorMatrix(int列,int行){
向量矩阵::~vectorMatrix(){}
无效向量矩阵::addCellAt(整数x,整数y,精灵*精灵){
标准向量<标准向量>矩阵;
矩阵[x][y]。推回(精灵);
}
但如果使用两个索引运算符,则会收到错误消息。

三个问题:

  • 在函数中声明一个局部变量
    matrix
    ,该变量会隐藏成员变量
  • 如果向量的大小未设置为包含
    x
    y
    索引,则将超出范围
  • 矩阵[x][y]
    本身不是一个向量,它是一个可以直接指定的元素:

    matrix[x][y] = sprite;
    
    记住在做这个之前要考虑问题2。

  • 三个问题:

  • 在函数中声明一个局部变量
    matrix
    ,该变量会隐藏成员变量
  • 如果向量的大小未设置为包含
    x
    y
    索引,则将超出范围
  • 矩阵[x][y]
    本身不是一个向量,它是一个可以直接指定的元素:

    matrix[x][y] = sprite;
    
    记住在做这个之前要考虑问题2。


  • 为什么你认为把你的矩阵变成向量的向量是个好主意?诚然,这将“起作用”,因为向量矩阵[i][j]的
    vec\u将返回正确的东西,但这有点麻烦和低效

    而是把你的类放在一个向量的基础上,所有的数据都是这样做的。元素访问将类似于(对于列主数据):


    您甚至可以使用行代理类安排
    map[x][y]
    工作。

    为什么您认为将矩阵作为向量向量是个好主意?诚然,这将“起作用”,因为向量矩阵[i][j]
    vec\u将返回正确的东西,但这有点麻烦和低效

    std::vector< std::vector<Sprite*> > matrix;
    

    而是把你的类放在一个向量的基础上,所有的数据都是这样做的。元素访问将类似于(对于列主数据):

    您甚至可以使用行代理类安排
    map[x][y]
    工作

    std::vector< std::vector<Sprite*> > matrix;
    
    然后您可以将xth和yth元素设置为相应的
    Sprite*
    ,当然
    x
    y
    应该小于

    matrix[x][y] = sprite;
    
    不要在
    addCellAt
    中再次声明
    matrix
    ,您可以直接在类中的任何位置使用数据成员

    然后您可以将xth和yth元素设置为相应的
    Sprite*
    ,当然
    x
    y
    应该小于

    matrix[x][y] = sprite;
    

    不要在
    addCellAt
    中再次声明
    matrix
    ,您可以直接在类中的任何位置使用数据成员。

    matrix[x][y]
    为您提供了一个
    Sprite*
    。您可能应该改为使用
    =
    为其分配空间,并切换到使用
    std::shared_ptr
    以避免内存泄漏而无法释放数据。您尚未为矩阵
    matrix[x][y]
    分配空间,因为它为您提供了一个
    Sprite*
    。您可能应该改为使用
    =
    为其分配,并切换到使用
    std::shared_ptr
    以避免内存泄漏而无法释放数据。您没有为矩阵分配空间本地矩阵是一个复制粘贴错误。。。sry-感谢您的澄清!本地矩阵是一个复制粘贴错误。。。sry-感谢您的澄清!非常感谢。我在很多例子中发现了这种方法,这就是为什么我想使用它。我不认为这太麻烦,但如果有一个更有效的方法,我会看看。绩效差异是否显著?我想我会在每个TrimeMatrx上调用几个操作,这样就可以很好地考虑。@克里斯:它很可能会更好地执行,因为元素访问不需要双重间接,也就是说,只有一个内存负载,而乘法+Add很好地被CPU所接受。谢谢!我在很多例子中发现了这种方法,这就是为什么我想使用它。我不认为这太麻烦,但如果有一个更有效的方法,我会看看。绩效差异是否显著?我想我会在每个TrimeMatrx上调用几个操作,这样就可以很好地考虑。@克里斯:它很可能会更好地执行,因为元素访问不需要双重间接,也就是说,只有一个内存负载,而乘法+Add很好地被CPU所满足。