0

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

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

我的代码:

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

4

2 回答 2

1

什么是向量。

关于向量的初学者教程

一点也不难——花时间了解 STL 集合,您将拥有适合您未来 80% 的东西的资源。

与其他集合不同,对于向量,您需要了解的唯一“特殊”事项是,擦除向量中间的元素将导致其余元素向下移动以缩小您刚刚创建的间隙。

于 2013-06-04T11:44:45.777 回答
0

您在 forloop 之前以正确的方式初始化向量;但在 for 循环的初始化部分:为什么要重新初始化它?

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

Iterator '将被初始化为 begin() [第一个元素] 并遍历其项目直到它到达结束。

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

您不应该将其与“<”运算符进行正常比较。它在到达结束时结束[即不包括结束位置]

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

但是,如果您想取消引用向量中的元素,请执行

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

于 2013-06-04T11:47:01.123 回答