从vector <object *> * object </object *>获取元素

时间:2015-01-22 22:56:59

标签: c++ stl

我有一个对象网格(x,y),我将它们插入一个线性向量中。

struct Invaders_t
{
    vector<Invader*> *invaders;
}

struct Invaders_t g_Invaders; 

    int y_spacing = 50;
    for (int j = 0; j < 5; j++)
    {
        x_spacing = 15;
        for (int i = 0; i < 8; i++)
        {
            Invader *invader = new Invader();
            g_Invaders.invaders->push_back(invader);
        }
    }

现在我想要一个入侵者,我知道方程式会是这样的 x + y*sizeOfVector;但我不知道从指针到入侵者指针的入侵者的语法。

此外,我如何从vector中删除元素?

3 个答案:

答案 0 :(得分:1)

您可以使用[]运算符访问向量的元素:

for ( int i = 0; i < invaders.size(); i++ ) {
    invaders[i]->doSomething();
}

或者,如果您使用的是C ++ 11,则可以使用基于范围的for循环:

for ( auto& i : invaders ) {
    i->doSomething();
}

在旁注中,您可能希望Invaders_t持有向量而不是指向向量的指针,除非您使用它,否则不需要它来保存指向Invader个对象的指针多态(在这种情况下,你应该使用智能指针):

std::vector<Invader> invaders;

对于(x,y)索引,您可以使用以下内容:

Invader& at( size_t x, size_t y ) {
    return invaders.at( x + y * row_size );
}

至于删除:

auto end = std::remove_if( invaders.begin(), invaders.end(),
    []( const Invader& i ) { return i.isDead(); } );
invaders.erase( end, invaders.end() );

答案 1 :(得分:1)

a)应为第一个g_Invaders.invaders分配一个内存或指向已创建的std::vector Invader*

b)第二个迭代过矢量,你可以做到:

  typedef vector<Invader*>::iterator It;
  for (It i = g_Invaders.invaders->begin(); i != g_Invaders.invaders->end(); ++i )
  {
     Invader *curr_invader = *i ;
     // use curr_invader as needed
  }

c)删除使用:

It i = g_Invaders.invaders->begin();
It j = i + ( x* NumberOfItemsInARow )+y; // advance iterator i 
delete *j;
g_Invaders.invaders->erase(j);

答案 2 :(得分:0)

  

现在我想要一个入侵者,我知道方程式将像x + y*sizeOfVector;但我不知道从入口指针到入侵者指针的入侵者的语法。

就像这样:

Invader *pinvader = (*(g_Invaders.invaders))[(x*NumberOfItemsInARow)+y];

或者:

Invader *pinvader = g_Invaders.invaders->at((x*NumberOfItemsInARow)+y);

请注意[]运算符不执行边界检查,而at()方法则执行。

  

此外,我如何从vector中删除元素?

像这样:

std::vector<Invader*>::iterator iter = g_Invaders.invaders->begin();
std::advance(iter, (x*NumberOfItemsInARow)+y);
Invader *invader = *iter;
g_Invaders.invaders->erase(iter);
delete invader;