昨天我开始学习C ++,所以我对此很陌生。 (我来自C#) 我正在尝试使用两个向量(活动和非活动)创建一个池,所以当我需要一个元素时,我从非活动向量中取出它并将其放入活动向量中。
我想我必须从非活动状态删除指针但将元素保留在内存中,对吧? 我怎么能这样做?
以下是迄今为止的内容:
SpritePool::SpritePool(const char *p)
{
path = p;
}
CCSprite SpritePool::GetSprite(){
while(poolVectorInactive.size == 0){
AddSprite();
}
}
CCSprite SpritePool::AddSprite(){
CCSprite *s = CCSprite::create(path);
poolVectorInactive.push_back(*s);
return *s;
}
答案 0 :(得分:0)
尝试这样的事情:
#include <algorithm>
#include <vector>
std::vector<CCSprite*>::iterator it = std::find_if(inactive.begin(), inactive.end(), [](CCSprite* sprite) { /* put your vector search logic (returning bool) here */ });
if (it != inactive.end())
{
active.push_back(*it);
inactive.erase(it);
delete *it;
}
请注意,它使用lambda表达式(参见例如http://www.cprogramming.com/c++11/c++11-lambda-closures.html),因此您需要一个兼容C ++ 11的编译器。如果你买不起奢侈品,可以写一个像以下的功能:
bool matcher(CCSprite* sprite)
{
/* code here */
}
并更改此部分:
std::vector<CCSprite*>::iterator it = std::find_if(inactive.begin(), inactive.end(), matcher);
另外,如果可以的话,尽量不要使用原始指针。将它们存放在例如unique_ptr
或shared_ptr
,因此您无需手动删除它们。这将为您节省一些泄漏和头痛。