0
我在我的程序中有這種情況,我想在std::vector
內使用std::iterators
對swcObject*
(抽象基類)進行迭代。如何std ::安全地在容器中交換元素
代碼:
class swcObject // abstract class
{
protected:
// inheritable members
// some are pure virtual functions()
// ...
public:
int x, y, width, height;
// getter/setter
private:
// implicit task()
}
std::vector<swcObject*> objects;
void other::OnClickSwapObject()
{
for (auto i = objects.rbegin(); i != objects.rend(); ++i)
{
if ((*i)->isClick(MOUSE_BUTTON_LEFT))
{
std::swap(*i, *objects.begin()); // is this the right syntax to do it?
break;
}
}
}
我很困惑了一下,如果我應該使用std::reverse_iterator
和std::swap(x)
使用std::vector::begin()
或std::vector::end()
,因爲在std::vector<swcObject*> objects
添加元素是通過向後(?)。 它的工作,但是我的代碼安全的這種事情?
如果我只有兩個元素,object.begin()和object.end()指向那兩個元素?我怎樣才能安全地交換這兩個值? – mr5
@ mr5不,end()不指向任何元素,它是最後一個元素之後的元素的佔位符。見圖[這裏](http://en.cppreference.com/w/cpp/container/vector/end)。要交換兩個值,你可以使用'std :: swap(object.front(),object.back())'或'std :: swap(object [0],object [1])或者std :: swap(* object.begin(),*(object.begin()+ 1))'。 –
ahh感謝您的鏈接...我只是想出另一個好主意...... **我會得到最後一個元素,並將其交換到當前的** – mr5