对象向量的向量

Vector of Vector of object

我在使用 vector of vector 时遇到一点问题。 我的 class 中有一个 std::vector<AObject*> _word,我说了算:

AObject *object = new Letters();
_word.push_back(object);

稍后我使用:

for (size_t i = 0 ; i < _word.size() ; ++i)  
    _word[i]->draw();

^ 这行得通,但我需要另一种实现方式

但我需要这样使用它:

在我的 class 中:std::vector<std::vector<AObject*> > _words;

AObject *obj = new Letters();
_word.push_back(obj);
_words.push_back(_word);

但是我遇到了内存损坏..

所以我不能这样使用我的向量向量:

for (size_t i = 0 ; i < _words.size() ; ++i)  
      _words[0][i]->draw();

谢谢!

编辑

我试过了:

for (size_t i = 0; i < _words.size() ; ++i)
{
  for (size_t j = 0 ; j < _word.size() ; ++j)  
        _words[i][j]->draw();
}

您在下面的块中错误地使用了索引:

for (size_t i = 0 ; i < _words.size() ; ++i)  
      _words[0][i]->draw();

应该是:

for (size_t i = 0 ; i < _words.size() ; ++i)  
      _words[i][0]->draw();
//           ^^^^ reverse i and 0

您有一个嵌套在向量中的向量。请注意术语 嵌套 。这意味着您需要某种嵌套循环来访问最内层的向量。

举个简单的例子:

std::vector<std::vector<AObject*>> vect;
//...
std::vector<AObject*> inner = {new AObject, new AObject, new AObject};
//...
vect.push_back(inner);
vect.push_back(inner);
vect.push_back(inner);
vect.push_back(inner);

所以 vect 中有 4 个项目,所有这些项目都是 std::vector<AObject*>,其中每个项目有 3 个项目。

现在当我们这样做时:

vect.size()

return 值为 4,因为这是 "outer" 向量中的项目数。

现在,如果我们像你那样写一个循环:

for (size_t i = 0 ; i < vect.size() ; ++i)  
    vect[0][i]->draw();

您正在循环访问(如果我们展开它):

vect[0][0]->draw();  // good
vect[0][1]->draw();  // good
vect[0][2]->draw();  // good
vect[0][3]->draw();  // <-- error

问题是没有vect[0][3]。内部向量只有 3 个项目,而不是 4 个项目。您正在访问越界的内存。

所以你的索引不正确。你想做的是:

vect[0][0]->draw();  // good
vect[0][1]->draw();  // good
vect[0][2]->draw();  // good

vect[1][0]->draw();  // good
vect[1][1]->draw();  // good
vect[1][2]->draw();  // good

vect[2][0]->draw();  // good
vect[2][1]->draw();  // good
vect[2][2]->draw();  // good

vect[3][0]->draw();  // good
vect[3][1]->draw();  // good
vect[3][2]->draw();  // good

所以循环应该是这样的:

for (size_t i = 0 ; i < vect.size() ; ++i)  
{
   size_t innerSize = vect[i].size(); 
   for (size_t j = 0; j < innerSize; ++j )
      vect[i][j]->draw();
}