2013-06-04 70 views
0

你好我試圖訪問包含一堆類對象的矢量元素,並只刪除矢量中的一個對象。使用帶矢量的STL迭代器

問題是我不明白載體,我無法在網上找到任何信息,這是有幫助的。

我的代碼:

void MyExperiment::deselectSingle() { 
Ogre::Vector3 vNewPos = mPickedObj->_getDerivedPosition(); 
mPickedObj->showBoundingBox(false); 
mMoveThis->removeChild(mPickedObj->getName()); 
mSceneMgr->getRootSceneNode()->addChild(mPickedObj); 
mPickedObj->_setDerivedPosition(vNewPos); 

for (Ogre::SceneNode* it = vObjects.begin(); it < vObjects.end(); it++) { 
    static std::string objNameStr; 
    objNameStr = vObjects.at(*it )->getName(); 
    if (objNameStr == mPickedObj->getName()) 
    { 
     vObjects.erase(*it); 
     break; 
    } 
} 
if (mMoveThis->numAttachedObjects() == 0) bSelected = false; 
return; 

}

我知道這個代碼將無法正常工作。我在網上閱讀了一些關於如何使用迭代器的東西,但是當我嘗試一些建議的錯誤出現時。事實上,我在這裏導致了一些錯誤。

我對這個函數的計劃是遍歷包含Ogre :: SceneNode指針元素的vObjects向量。如果其中一個元素與mPickedObj的名稱匹配,那麼我想通過.erase()foo從矢量中刪除它。上面的代碼不起作用,它只是作爲一個例子,儘管這是我在我的應用程序中嘗試的。

回答

1

What a vector is.

A beginner's tutorial on vectors

不是太難的話 - 花時間去了解STL集合,你就會有適合爲你將來需要的東西80%的資源。

與其他集合相比,唯一需要知道的向量的「特殊」事情是,擦除矢量中間的元素將導致其餘元素向下移動以縮小間距你剛剛製造。

+0

從std :: deque的中間擦除也會導致某些元素「向下移動以縮小差距」 –

+0

您的80%估計值太低。從矢量開始擦除比從中間擦除更糟糕。 –

0

你正在初始化正確的矢量在forloop之前; 但在for循環的初始化部分:爲什麼重新初始化它?

Ogre::SceneNode* it = vObjects.begin() 

迭代器將被初始化爲begin()[第一個元素]並遍歷它的項目直到它結束。

(it=vObjects.begin();it!=vObjects.end();it++) 

您不應該將其與'<'運算符進行比較。它結束,當它到達終點【獨家即結束位置]

我不知道什麼是vObjects.erase(*吧)......

但是,如果你想取消引用向量元素做

vector[i] //if ith element already present if not it causes segmentation fault [can use it like normal array] 
vector.at(i) //safe and if doesn't exist throws exception 

用於刪除傳遞迭代器位置以擦除(it)的元素以將其刪除;如果元素終於可以使用pop_back()。

+0

它被創建和初始化兩次,因爲這是舊代碼混合新代碼。我只是把舊的迭代器留在那裏,因爲我懶得刪除它,儘管我應該有。你是對的。事實是,我沒有,仍然不知道如何迭代我的場景節點指針向量。我的計劃是:遍歷vObjects場景節點指針向量,並且如果其中一個元素與mPickedObj的名稱相匹配,則通過erase()將其從向量中刪除,因爲我們只想在該當前元素上執行一次操作。 – Braineeee

+0

我編輯的東西,使其更清楚,並刪除應該的一切。 – Braineeee