Vector 使用带向量的STL迭代器

Vector 使用带向量的STL迭代器,vector,stl,iterator,Vector,Stl,Iterator,您好,我正在尝试访问包含一组类对象的向量的元素,并从向量中仅删除一个对象 问题是我不懂向量,也无法在网上找到任何有用的信息 我的代码: void MyExperiment::deselectSingle() { Ogre::Vector3 vNewPos = mPickedObj->_getDerivedPosition(); mPickedObj->showBoundingBox( false ); mMoveThis->removeChild( mPickedObj->

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

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

我的代码:

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;
void MyExperiment::deselectSingle(){
Ogre::Vector3 vNewPos=mPickedObj->_getDerivedPosition();
mPickedObj->showBoundingBox(假);
mMoveThis->removeChild(mPickedObj->getName());
mSceneMgr->getrootsceneode()->addChild(mPickedObj);
mPickedObj->_设置衍生位置(vNewPos);
对于(Ogre::sceneode*it=vObjects.begin();itgetName();
如果(objNameStr==mPickedObj->getName())
{
vObjects.erase(*它);
打破
}
}
如果(mMoveThis->numatachedobjects()==0)bSelected=false;
返回;
}

我知道这个密码行不通。我在网上读过一些关于如何使用迭代器的东西,但是当我尝试一些东西时,会出现一些提示错误。事实上,我这里的内容会导致一些错误

我对这个函数的计划是遍历包含Ogre::sceneode指针元素的vObjects向量。如果其中一个元素与mPickedObj的名称匹配,那么我希望通过.erase()foo将其从向量中删除。上面的代码不起作用,它只是一个例子,尽管我在应用程序中尝试了它。

一点也不难——花点时间了解STL集合,您将拥有一个资源,可以满足未来80%的需求


对于向量,你需要知道的唯一的“特殊”的东西,而不是其他集合,是在向量中间擦除一个元素会使其余元素向下移动,以关闭刚才所做的间隙。

你在FrRoad之前右向初始化向量。 但在for循环的初始化部分:为什么要重新初始化它

Ogre::SceneNode* it = vObjects.begin() 
迭代器将被初始化为begin()[first element],并循环遍历其项,直到到达末尾

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

std::deque
中间删除也会导致某些元素“向下移动以缩小差距”。您的80%估计值太低。从向量的开头擦除比从中间擦除更糟糕。它被创建并初始化了两次,因为这是旧代码和新代码的混合。我只是把旧迭代器放在那里,因为我太懒了,不想删除它,尽管我应该删除它。你说得对。事实上,我没有也仍然不知道如何迭代场景节点指针的向量。我的计划是:迭代vObjects场景节点指针向量,如果其中一个元素与mPickedObj的名称匹配,则通过erase()和break将其从向量中删除,因为我们只想在当前元素上执行一次。我编辑了该内容以使其更清晰,并删除所有本应删除的内容。