如何使用std :: sort以“自定义”的方式对数组进行排序

时间:2018-03-25 03:18:01

标签: c++ algorithm

我有一个大小为4N的浮点数组,我想通过将每组4个浮点数作为单个项目进行排序 - 比如说(x,y,z,w),然后我想基于它们对它们进行排序关于z值。

我当前的方法涉及制作一个

数组
struct A
{
    float *p;
    int index;

    bool operator < (const A &obj)
    {
        return ( *(p + 2) < *(obj.p + 2) );
    }
};

在其上使用std::sort,然后创建一个大小为4N的新数组,并根据相应的索引填充它。

我确定有一种方法可以对它进行排序,但我无法弄清楚如何

3 个答案:

答案 0 :(得分:0)

这样的事情:

struct A
{
    float x, y, z, w;

    bool operator < (const A &other) const
    {
        return z < other.z;
    }
};

enum { N = 1000 };
float v[4 * N];
...
A *w = reinterpret_cast<A*>(v);
sort(w, w + N);

答案 1 :(得分:0)

#define N 55
float *array = new float[4*N];
// fill the array
A* a = reinterpret_cast<A*>(array);
sort(a, a+N);

答案 2 :(得分:0)

这可以使用gsl::span(建议用于标准化)来完成。 Here is the SOURCE。如果您将 spans 的向量 overlay 添加到浮动的向量中,则可以对 spans 进行排序并使用将spans排序为模板,将原始值重新排序为新的已排序容器。

这样的事情:

    auto const N = 2;

    std::vector<float> floats = {4.0, 5.0, 6.0, 7.0, 0.0, 1.0, 2.0, 3.0};

    assert(floats.size() == 4 * N);

    std::vector<gsl::span<float, 4>> overlays; // spans of 4 floats

    for(auto i = 0U; i < floats.size(); i += 4)
        overlays.emplace_back(&floats[i], 4); // arrange them over the vector

    // sort the spans
    std::sort(std::begin(overlays), std::end(overlays), [](auto a, auto b){
        return a[2] < b[2]; // sort by the third float
    });

    std::vector<float> sorted_floats; // results

    // copy the "contents" of the spans in the correct (sorted)
    // order into the new container
    for(auto const& o: overlays)
        std::copy(std::begin(o), std::end(o), std::back_inserter(sorted_floats));

注意:

gsl::span本身不是容器,它只是将窗口视图呈现到容器中。在这个例子中,我创建了一个这样的 windows 的向量,每个向量都在查看原始向量,并且每个 span 都是4 浮动