0

昨天我开始学习 C++,所以我对此很陌生。(我来自 C#)我试图用两个向量(活动和非活动)做一个池,所以当我需要一个元素时,我从非活动向量中取出它并将其放入活动向量中。

我想我必须从非活动中删除指针,但将元素保留在内存中,对吗?我怎样才能做到这一点?

以下是 In 到目前为止的内容:

    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;

}
4

1 回答 1

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

另外,如果可以的话,尽量不要使用原始指针。将它们存储在 egunique_ptrshared_ptr中,因此您不必手动删除它们。这将为您节省一些泄漏和头痛。

于 2013-10-13T18:57:37.657 回答