如何在C ++中将元素从向量切换到另一个?

时间:2013-10-13 18:31:07

标签: c++ dynamic vector cocos2d-x

昨天我开始学习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;

}

1 个答案:

答案 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_ptrshared_ptr,因此您无需手动删除它们。这将为您节省一些泄漏和头痛。