使用带向量的STL迭代器

时间:2013-06-04 11:34:12

标签: vector stl iterator

您好我正在尝试访问包含一堆类对象的向量元素,并且只从向量中删除其中一个对象。

问题是我不理解向量,我在网上找不到任何有用的信息。

我的代码:

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将其从向量中删除。上面的代码不起作用,它只是作为一个例子,虽然它是我在我的应用程序中尝试的。

2 个答案:

答案 0 :(得分:1)

What a vector is.

A beginner's tutorial on vectors

根本不太难 - 花点时间了解STL系列,你将拥有适合未来80%所需资源的资源。

对于矢量而言,与其他集合相比,您需要知道的唯一“特殊”事情是,在矢量中间删除元素将导致其余元素向下移动以缩小您的间隙刚做完。

答案 1 :(得分:0)

你在forloop之前正在初始化矢量; 但是在for循环的初始化部分:为什么要重新初始化它?

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

Iterator将被初始化为begin()[first element]并循环遍历其项目,直到它结束。

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

你不应该正常地将它与'&lt; '运营商。它到达终点时结束[即结束位置排除]

我不确定什么是vObjects.erase(* it)......

但是如果你想取消引用vector中的元素

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()。