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;
}
}
}
나는 조금 혼란 스러워요 (?). 작동하지만 내 코드가 이런 종류의 일에 안전합니까?
두 개의 요소 만있는 경우'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 :: 스왑 (* object.begin(), * (object.begin() + 1))'. –
아아 링크에 감사드립니다 ... 나는 또 다른 좋은 아이디어를 얻었습니다. ** 마지막 요소를 가져 와서 현재의 것으로 바꿔 봅니다. ** – mr5