2013-06-04 3 views
0

Здравствуйте, я пытаюсь получить доступ к элементу вектора, содержащего кучу объектов класса и удаляя только один из объектов из вектора.Использование итераторов 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; 

}

Я знаю, что этот код не будет работать. Я читал некоторые вещи в Интернете о том, как использовать итераторы, однако, когда я пытаюсь выявить некоторые из предложенных ошибок. На самом деле то, что у меня здесь, вызывает несколько ошибок.

Мой план этой функции состоял в том, чтобы перебирать вектор vObjects, содержащий элементы указателя Ogre :: SceneNode. Если один из элементов соответствует имени mPickedObj, то я хочу удалить его из вектора с помощью .erase() foo. Вышеприведенный код не работает, он был только как пример, хотя это то, что я пробовал в своем приложении.

ответ

1

What a vector is.

A beginner's tutorial on vectors

Не слишком трудно вообще - взять время, чтобы понять коллекции STL, и вы будете иметь ресурс, который соответствует 80% вещей, которые нужно в будущем.

Единственная «специальная» вещь, которую вам нужно знать для вектора, в отличие от других коллекций, состоит в том, что стирание элемента в середине вектора приведет к тому, что остальные элементы будут перемещаться вниз, чтобы закрыть промежуток вы только что сделали.

+0

Стирание с середины 'std :: deque' также приводит к тому, что некоторые элементы« перемещаются вниз, чтобы закрыть промежуток » –

+0

Ваша оценка 80% слишком низкая. И стирание с начала вектора еще хуже, чем удаление из середины. –

0

вы инициализируете вектор вправо перед заходом; , но в части инициализации цикла for: зачем снова инициализировать его?

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

итератора будет быть инициализирован, чтобы начать() [] первый элемент и петли через пункт до тех пор, пока не достигнет конца.

(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 

для удаления элемента вы передаете позицию итератора для удаления (его), чтобы удалить его; если элемент наконец-то может использовать pop_back().

+0

Его создавали и инициализировали дважды, потому что это старый код, смешанный с новым кодом. Я просто оставил старый итератор там, потому что я был слишком ленив, чтобы удалить его, хотя должен был. Ты прав. Правда в том, что я не сделал и до сих пор не знаю, как итерации по вектору указателей узлов сцены.Мой план состоял в следующем: итерации через вектор указателя узла узла vObjects, и если один из элементов соответствует имени mPickedObj, удалите его из вектора по erase() и перерыв, так как мы хотим сделать это только один раз и на этом текущем элементе. – Braineeee

+0

Я отредактировал вещь, чтобы сделать ее более ясной и удалить все, что должно было быть. – Braineeee

Смежные вопросы