我有一个大小为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的新数组,并根据相应的索引填充它。
我确定有一种方法可以对它进行排序,但我无法弄清楚如何
答案 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
浮动宽