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