2011-12-23 4 views
2

좌표를 정렬 기준으로 정렬하려는 경우 xy 좌표를 기준으로 정렬하고 싶습니다. 다음은 내가 한 일이지만, 내가 원하는 것은 x을 기반으로 정렬 할 때 적절하지만, y을 기준으로 정렬 할 때 내 x 순서를 변경하지 않으려 고합니다.x 및 y 좌표를 기준으로 정렬

#include <vector> 
#include <algorithm> 
#include <iostream> 
#include <iterator> 

struct item_t { 
    int x; 
    int y; 
    item_t(int h, int w) : x(h), y(w) {} 
    friend std::ostream& operator<<(std::ostream& os, const item_t& gt) { 
     os << "(" << gt.x << "," << gt.y << ")"; 
     return os; 
    } 
}; 
typedef std::vector<item_t> item_list_t; 
typedef item_list_t::iterator item_list_itr_t; 

struct compare_x { 
    bool operator()(const item_t& left, const item_t& rigx) const { 
     return left.x < rigx.x; 
    } 
}; 
struct compare_y { 
    bool operator()(const item_t& left, const item_t& rigx) const { 
     return left.y < rigx.y; 
    } 
}; 

int main (int argc, char **argv) { 
    item_list_t items; 

    items.push_back(item_t(15, 176)); 
    items.push_back(item_t(65, 97)); 
    items.push_back(item_t(72, 43)); 
    items.push_back(item_t(102, 6)); 
    items.push_back(item_t(191, 189)); 
    items.push_back(item_t(90, 163)); 
    items.push_back(item_t(44, 168)); 
    items.push_back(item_t(39, 47)); 
    items.push_back(item_t(123, 37)); 

    std::sort(items.begin(), items.end(), compare_x()); 
    std::copy(items.begin(),items.end(), std::ostream_iterator<item_t>(std::cout," ")); 
    std::cout << std::endl; 

    std::sort(items.begin(), items.end(), compare_y()); 
    std::copy(items.begin(),items.end(), std::ostream_iterator<item_t>(std::cout," ")); 

    std::cout << std::endl; 

} 

점차 증가하는 순서로 주문을 받고 싶습니다. 즉 xy이 모두 증가하고 있습니다.

당신은 하나의 패스에 정렬을해야
+0

예상되는 출력의 예를 들려 줄 수 있습니까? 이 질문에서 분명하지 않습니다. – Naveen

+0

첫 번째로'left.x rigx.y' 일 때 무엇을 기대하는지 결정해야합니다. 이 경우 어떤 주문을해야합니까? – Skyler

답변

5

:

struct compare_xy { 
    bool operator()(const item_t& left, const item_t& right) const { 
     return (left.x == right.x ? left.y < right.y : left.x < right.x); 
    } 
}; 
+0

그가 (std :: stable_sort 대신) 찾고있는 것이면. 그러나 그의 설명과 예제에서 순서를 존중하기 위해서는'x'가 아니라'y'를 먼저 비교해야합니다. –

+0

내가 쓴 것은 내가 X의 첫 번째 정렬과 X의 일치를 위해 Y로 정렬하는 질문에 대해 이해하는 것과 일치합니다. – Mat

+0

질문에서 원하는 것을 결정하는 것이 다소 어렵습니다. 나는 그것을 먼저 X로 정렬 한 다음 Y로 정렬하는 것을 의미하지만 Y가 같으면 순서를 어지럽히 지 말라는 의미로 해석합니다. 사실, 그가 나에게 묻고있는 것처럼 보이는 것은 안정된 정렬을위한 것이 었습니다. 그러나 나는 그의 질문이 여러면에서 해석 될 수 있음을 인정할 것이다. –

4

을 당신은 하나 개의 비교기를 만들어야 할 단 하나의 호출 std::sort에 :

struct compare_xy { 
    bool operator()(const item_t& left, const item_t& right) const { 
     return (left.x < right.x) || ((left.x == right.x) && (left.y < right.y)); 
    } 
}; 
1

그것은 나에게 완전히 명확하지 않다 무엇을 묻습니다. 당신의 목표는 xy 년대가 동일한 순서를 결정하는, y에 의해 일종의 경우, 다음 단일 통화는 비교 함수로 정렬하려면 :

struct OrderYThenX 
{ 
    bool operator()(item_t const& lhs, item_t const& rhs) const 
    { 
     return lhs.y < rhs.y 
      || (!(rhs.y < lhs.y) && lhs.x < rhs.x); 
    } 
}; 

이가이를 구비 items가 발생합니다 마지막으로 주문한 코드는 입니다. 귀하의 설명과 예 부분에서 가능성이 보인다, 당신이 상관없이, 때를 일종의 y에 의해 변경으로 동일한 y의와 객체 사이의 순서를 원하는 경우

값이 대한 명령을 받았다 방법 x으로 변경하려면 std::stable_sort을 사용해야합니다. 단지 이 std::sort보다 느릴 수 있음을 알고 있어야합니다.

관련 문제