2013-07-06 18 views
0

我在我的程序中有這種情況,我想在std::vector內使用std::iteratorsswcObject*(抽象基類)進行迭代。如何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_iteratorstd::swap(x)使用std::vector::begin()std::vector::end(),因爲在std::vector<swcObject*> objects添加元素是通過向後(?)。 它的工作,但是我的代碼安全的這種事情?

回答

0

i是一個反向迭代器的事實沒有區別。如果你想將i的值與矢量的第一個值交換,你應該做你正在做的事情。另請注意,由end()返回的迭代器位於向量中的最後一個元素之後,因此永遠不應解除引用。

+0

如果我只有兩個元素,object.begin()和object.end()指向那兩個元素?我怎樣才能安全地交換這兩個值? – mr5

+0

@ 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))'。 –

+0

ahh感謝您的鏈接...我只是想出另一個好主意...... **我會得到最後一個元素,並將其交換到當前的** – mr5