【问题标题】:Sorting Vector of Coordinates C++坐标向量的排序 C++
【发布时间】:2013-10-21 00:06:14
【问题描述】:

我正在尝试对坐标向量进行排序。该向量具有指向这些坐标的指针。我想按 x 和 y 对它们进行排序。我目前正在考虑如何做到这一点如下制作向量的两个副本,然后对它们进行排序。我不确定以下两件事: 1) 如何复制指针向量 2) 如何通过向量中的 x 和 y 对两个点进行排序,并确保它们正确排序如下 (1,4),(1,5)

我一直在阅读并试图弄清楚是否有任何内置函数,但我不确定例如 sort function 是否会正确地按顺序正确排序 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);

【问题讨论】:

    标签: c++ sorting vector copying


    【解决方案1】:

    使用自定义比较器进行解引用以及现成的字典元组比较相当容易:

    #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); });
    

    当然,只要您使用vxy 中的指针,指针指向的对象就必须存在。

    【讨论】:

    • 真的就这么简单吗?
    • @Masterminder:Modulo 得到所有所有权语义正确,当然,为什么不。
    • 所以一旦我复制了向量,如果我指定了 tie 部分,排序会为我做这件事吗?就像它实际上会重新排列指针一样吗?
    • xy 向量将根据指定的字典顺序进行排序。原始向量v 将保持不变。
    • 这是否可以重写?我收到一些错误消息并正在尝试修复它们,但我的编译器抱怨它没有库支持并且它目前是实验性的。它还说我应该在 [] 之前有一个主要表达式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多