-1

座標のベクトルをソートしようとしています。ベクトルには、これらの座標へのポインターがあります。x と y で並べ替えたいと思います。私が現在これを行う方法を考えているのは、次のようにベクトルの 2 つのコピーを作成し、それらを並べ替えることです。次の 2 つの点がよくわかりません: 1) ポインターのベクトルのコピーを作成する方法 2) ベクトル内の x と y で両方の点を並べ替え、次のように適切に並べ替える方法 (1,4 ),(1,5)

組み込み関数があるかどうかを読んで把握しようとしましたが、たとえば、並べ替え関数が x と 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={(-2,4),(1,3),(1,7),(4,4)} と Y={(1,3),(-2 ,4),(4,4),(1,7)}


アップデート:

私は現在この段階にありますが、まだ機能していません... :(

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);
4

1 に答える 1

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もちろん、ポインターが指すオブジェクトは、少なくとも 、 、xおよびでポインターを使用している限り存続する必要がありyます。

于 2013-10-21T00:10:04.873 に答える