2013-10-13 81 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)共享指針不是好主意。 –

相關問題