2011-12-23 23 views
2

xyの座標に基づいてvectorをソートしたいと思います。以下は私がやったことですが、私が望むのは、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; 

} 

ポイントオーダーを昇順に指定したいとします。すなわちxおよびyが両方とも増加している。

あなたは、単一のパスでソートを行う必要があります
+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

をあなたが唯一の1個のコンパレータを作成する必要があり、唯一のコール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

それは私には全く明らかではない何尋ねる

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になります:あなたの目標はxy年代が等しいとき、 は、比較機能をソートするための単一の呼び出し順序を決定し、yにより ソートにある場合最終的には にあなたのコードがあります。あなたの説明とあなたの 例の部分からの可能性が高いと思われるように、あなたは関係なく、ときにソートyによって 変わらないように等しいy sのオブジェクト間の順序をしたい場合は

値は に関して注文しましたかxには、std::stable_sortを使用してください。ただ がstd::sortより遅くなる可能性があることを認識しているだけです。

関連する問題