2013-07-06 3 views
0

std::iterators을 사용하여 swcObject* (추상 기본 클래스) 유형을 가진 std::vector 내부에서 반복하고 싶은이 프로그램을이 프로그램에서 사용하고 있습니다.std :: 컨테이너의 요소를 안전하게 교환하는 방법

코드 : 나는 std::reverse_iterator을 사용하고 뒤로 통해 std::vector<swcObject*> objects에 요소를 추가하기 때문에 std::swap(x)std::vector::begin() 또는 std::vector::end()을 사용하는 경우는

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; 
     } 
    } 
} 

나는 조금 혼란 스러워요 (?). 작동하지만 내 코드가 이런 종류의 일에 안전합니까?

답변

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 :: 스왑 (* object.begin(), * (object.begin() + 1))'. –

+0

아아 링크에 감사드립니다 ... 나는 또 다른 좋은 아이디어를 얻었습니다. ** 마지막 요소를 가져 와서 현재의 것으로 바꿔 봅니다. ** – mr5

관련 문제