2013-10-21 3 views
-1

좌표 벡터를 정렬하려고합니다. 벡터에는 이러한 좌표에 대한 포인터가 있습니다. 나는 그들을 x와 y로 정렬하고 싶다. 현재이 작업을 수행하는 방법은 다음과 같이 벡터의 두 복사본을 만든 다음 정렬하는 것입니다. 다음 두 가지에 대해 확신이 없습니다. 1) 포인터의 벡터 사본을 만드는 방법 2) 벡터에서 두 점을 모두 x와 y로 정렬하고 다음과 같이 올바르게 정렬되는지 확인하십시오 (1 , 4), (1,5)좌표 벡터 정렬 C++

나는 내장 함수가 있는지 알아 내려고했지만, 예를 들어 정렬 함수이 올바르게 x와 y를 순서대로 정렬하면 확실하지 않습니다. .

여기까지 내가 지금까지 가지고있는 도움이 감사하겠습니다. = {- {(2,4), (1,3), (1,7), (4,4)} 및 Y

typedef struct{double x; double y;) pt; 
vector<pt*>v1; 
vector<pt*>*v2 = v1; 
// allocate memory for the points and push_back on the vector 
the vector would have the following points {(1,7),(4,4),(1,3),(-2,4)} 

X 대를 정렬 할 때, X = 것 (1,3), (- 2,4), (4,4), (1,7)}


UPDATE :이 단계에서 현재 오전하지만 여전히 작동하지 않습니다

... :(

bool compare(pt* m1, pt* m2){return(m1->x <= m2->x) && (m1->y <= m2->y);} 

vector<pt*>v1_x = v1; 
sort(v1_x.begin(), v1_x.end(), comparer); 

답변

2

' 공정하게 역 참조 할 수있는 사용자 정의 비교를 사용하여 쉽게뿐만 아니라 기성이야 사전 식 튜플 비교 : 당신은을 사용하고 같은 개체가 적어도 한 살아야한다 포인터가 가리키는 물론

#include <algorithm> 
#include <tuple> 
#include <vector> 

struct pt { double x, double y }; 

std::vector<pt*> v = /* ... */ ; 

auto x = v, y = v; // copies 

std::sort(x.begin(), x.end(), 
      [](pt * a, pt * b) -> bool 
      { return std::tie(a->x, a->y) < std::tie(b->x, b->y); }); 

std::sort(y.begin(), y.end(), 
      [](pt * a, pt * b) -> bool 
      { return std::tie(a->y, a->x) < std::tie(b->y, b->x); }); 

포인터는 v, xy입니다.

+0

정말 그렇게 간단합니까? – Masterminder

+0

@ Masterminder : 모든 소유권 의미를 올바르게 얻는 모듈체. –

+0

그래서 일단 벡터의 복사본을 만들면 타이 부분을 지정하면 정렬이 나를 대신 할 것입니다. 마찬가지로 그것은 실제로 포인터를 재정렬 할 것인가? – Masterminder