从 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);
我有一个对象网格 (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);