对象向量的向量
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();
}
我在使用 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();
}