【问题标题】:Using STL iterators with vectors将 STL 迭代器与向量一起使用
【发布时间】:2013-05-30 18:50:48
【问题描述】:

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

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

我的代码:

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

【问题讨论】:

    标签: vector stl iterator


    【解决方案1】:

    What a vector is.

    A beginner's tutorial on vectors

    一点也不难 - 花点时间了解 STL 集合,您将拥有适合您未来所需内容的 80% 的资源。

    与其他集合相比,对于向量,您需要了解的唯一“特殊”事项是,擦除向量中间的元素会导致其余元素向下移动以缩小您的差距刚刚制作。

    【讨论】:

    • std::deque 的中间擦除也会导致一些元素“向下移动以缩小差距”
    • 您的 80% 估计值太低了。而且从向量的开头擦除甚至比从中间擦除还要糟糕。
    【解决方案2】:

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

    【讨论】:

    • 它被创建和初始化了两次,因为那是旧代码与新代码的混合。我只是把旧的迭代器留在了那里,因为我懒得删除它,尽管我应该删除它。你是对的。事实是我没有并且仍然不知道如何遍历我的场景节点指针向量。我的计划是:遍历 vObjects 场景节点指针向量,如果其中一个元素与 mPickedObj 的名称匹配,则通过 erase() 将其从向量中删除并中断,因为我们只想对当前元素执行一次。跨度>
    • 我编辑了该内容以使其更清晰,并删除了所有应有的内容。
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 2020-11-06
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2012-01-05
    • 2016-10-11
    相关资源
    最近更新 更多