从 vector<object*> *object 获取一个元素

Getting an element from vector<object*> *object

我有一个对象网格 (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 中删除一个元素?

Now I would like to an invader out of that, I know the equation will be like x + y*sizeOfVector; but I don't know the syntax to get an invader out of that pointer to pointer of invaders.

会是这样的:

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

或者:

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

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

Further more, How would I remove an element from 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;

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

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

a) 第一个 g_Invaders.invaders 应该被分配一个内存或者指向已经创建的 std::vector of 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);