2013-10-13 49 views
0

昨天我开始学习C++,所以我很新。 (我来自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; 

} 
+2

什么是矢量的定义和声明? –

+0

private: \t vector poolVectorActive; – demilp

回答

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

注意,它使用拉姆达表达式(见例如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,因此您不必手动删除它们。这将为您节省一些泄漏和头痛。

+1

Cococ2d-x有自己的“自动管理系统”称为自动释放池,并使用与CCObject(如CCSprite)共享指针不是好主意。 –

相关问题