0

こんにちは、一連のクラス オブジェクトを含むベクターの要素にアクセスし、ベクターからオブジェクトを 1 つだけ削除しようとしています。

問題は、私がベクトルを理解していないことと、役立つ情報をオンラインで見つけることができないことです。

私のコード:

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 ベクトルを反復処理することでした。要素の 1 つが 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() [最初の要素] に初期化され、end に到達するまでアイテムをループします。

 (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 に答える