【问题标题】:Vector of Vector of object对象向量的向量
【发布时间】:2015-06-08 18:22:17
【问题描述】:

我在使用向量的向量时遇到了一点问题。 我班上有一个std::vector<AObject*> _word,我言出必行:

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

后来我用:

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

^ 这可行,但我需要另一个实现

但我需要这样使用它:

在我的课堂上:std::vector&lt;std::vector&lt;AObject*&gt; &gt; _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 循环中,您引用了 _world.size( ),它描述了 第一个 维度的大小,但您将其用作第二个维度的索引方面。这是未定义的行为。
  • 你确定new Letters() 做你想做的事吗?
  • 所以我应该使用 _world[0].size() ?
  • @GlennTeitelbaum 是的,因为它适用于简单的矢量,当我画我的字时,屏幕上有字母
  • AObject *obj = new Letters(); 不要你自己使用new/delete管理内存!使用容器或smart pointers

标签: c++ arrays vector segmentation-fault


【解决方案1】:

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

举个简单的例子:

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&lt;AObject*&gt;,其中每个项目有 3 个项目。

现在当我们这样做时:

vect.size()

返回值为 4,因为这是“外部”向量中的项目数。

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

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();
}

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多