对vector使用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向量。如果其中一个元素匹配mpickkedobj的名称,那么我想通过。erase() foo从向量中删除它。上面的代码不起作用,它只是作为一个例子,尽管它是我在我的应用程序中尝试的。

什么是vector

矢量初学者教程

一点也不难——花点时间去理解STL集合,你就会有一个适合你将来需要的80%的资源。

与其他集合不同的是,对于vector容器,你需要知道的唯一"特殊"的事情是,删除vector容器中间的一个元素会导致其他元素下移,以闭合你刚刚创建的空白。

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

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

迭代器初始化为begin()[第一个元素],循环遍历它的元素,直到到达end。

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

你不应该将它与'

我不知道什么是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

删除元素时,传递erase(it)的迭代器位置来删除它;如果元素是最后可以使用pop_back()。

最新更新