【问题标题】:Sort an array of struct by a given member of the struct (quick sort)按结构的给定成员对结构数组进行排序(快速排序)
【发布时间】:2020-04-08 02:54:58
【问题描述】:

我有一个坐标数组(结构类型向量),我想先按 x 坐标排序,然后按 y 坐标排序。除了编写两个单独的快速排序函数之外,有没有办法将成员(x 或 y)作为参数传递,并以此进行排序?

基本上有一个axis的变量类型,我可以使用这样的t[i].axis当axis为x时表示x坐标,当它为y时表示y坐标

我的结构:

struct point {
    float x, y;
};

编辑: 我通过编写一个比较函数来解决这个问题,该函数基于轴进行比较,但如果有人回答我的问题,我将不胜感激:)

【问题讨论】:

  • 你可以自己回答你自己的问题
  • 您应该澄清这个问题是针对 C 还是 C++ 程序的。你的问题也不够清楚。您是否想要一个 Quicksort 函数按字段为参数的每个字段对向量进行排序?
  • 我正在使用 C++。是的,我希望一个函数能够按任一字段对向量进行排序。

标签: c++ c sorting struct quicksort


【解决方案1】:

我不完全理解你的问题。但是,如果您想选择要对结构的哪个成员进行排序,则可以使用以下非常简单的函数。

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

struct Point {
    float x{};
    float y{};

    friend std::ostream& operator << (std::ostream& os, const Point& p) {
        return os << "X: " << std::left << std::setw(6) << p.x << "  Y: " << std::setw(6) << p.y << "\n";
    }
};

inline void selectiveSort(std::vector<Point>& vp, float Point::* member) {
    std::sort(vp.begin(), vp.end(), [&](const Point & p1, const Point & p2) { return p1.*member < p2.*member; });
}

int main(void) {
    // Define and initialise vector
    std::vector<Point> points{ {1.0,9.0},{2.0,8.0},{3.0,7.0},{4.0,6.0},{5.0,5.0},{6.0,4.0},{7.0,3.0},{8.0,2.0},{9.0,1.0} };

    // Sort by y and display result
    selectiveSort(points, &Point::y);
    std::copy(points.begin(), points.end(), std::ostream_iterator<Point>(std::cout)); std::cout << "\n";

    // Sort by x and display result
    selectiveSort(points, &Point::x);
    std::copy(points.begin(), points.end(), std::ostream_iterator<Point>(std::cout)); std::cout << "\n";

    return 0;
}

【讨论】:

    最近更新 更多