用C++对结构数组进行排序

Sorting an array of structs in C++

本文关键字:排序 数组 结构 C++      更新时间:2023-10-16

我正在为游戏使用用c++编写的粒子物理库。

为了绘制粒子,我必须得到它们所有位置的数组,比如…

b2Vec2* particlePositionBuffer = world->GetParticlePositionBuffer();

这将返回b2Vec2对象的数组(表示物理引擎中的二维向量)
我还可以使用获取并设置它们的颜色

b2ParticleColor* particleColourBuffer = world->GetParticleColorBuffer();

我想得到10%具有最高Y值的粒子(然后改变它们的颜色)

我的想法是…
1。制作一个与particlePositionBuffer数组大小相同的结构数组,该结构只包含一个int(particlePositionBuffer数组中的粒子索引)和一个float(粒子y位置)
2。然后我按y位置对数组进行排序
3.然后,我使用结构中结构数组中前10%结构中的int来填充particleColourBuffer数组中它们的颜色。

有人能告诉我如何在c++中对这样的结构进行排序和数组吗
你还认为这是一个不错的方式吗?我只需要做一次(不是每帧)

以下可能会有所帮助:

// Functor to compare indices according to Y value.
struct comp
{
explicit comp(b2Vec2* particlePositionBuffer) :
particlePositionBuffer(particlePositionBuffer)
{}
operator (int lhs, int rhs) const
{
// How do you get Y coord ?
// note that I do rhs < lhs to have higher value first.
return particlePositionBuffer[rhs].getY() < particlePositionBuffer[lhs].getY();
}
b2Vec2* particlePositionBuffer;
};
void foo()
{
const std::size_t size = world->GetParticleCount(); // How do you get Count ?
const std::size_t subsize = size / 10; // check for not zero ?
std::vector<std::size_t> indices(size);
for (std::size_t i = 0; i != size; ++i) {
indices[i] = i;
}
std::nth_element(indices.begin(), indices.begin() + subsize, indices.end(),
comp(world->GetParticlePositionBuffer()));
b2ParticleColor* particleColourBuffer = world->GetParticleColorBuffer();
for (std::size_t i = 0; i != subsize; ++i) {
changeColor(particleColourBuffer[i])
}
}

如果粒子数较低,无论哪种方式都无关紧要,使用简单的stl排序例程首先对它们进行排序就可以了。

如果这个数字很大,我会创建一个二进制搜索树,其最大大小是粒子数量的10%。然后我会维护实际存储在树中的minY,以便快速拒绝。然后这个算法应该做到:

  • 遍历原始数组并将项目添加到树中,直到它已满(10%)
  • 更新你的minY
  • 对于原始数组中的剩余项
    • 如果item.y小于minY,则转到下一个项目(快速拒绝)
    • 否则
      • 从树中删除当前最小的Y值
      • 将较大的Y项目添加到树中
      • 更新MinY

二进制搜索树具有快速插入、快速搜索和保持排序的优点。如果您想成为FAST,这比对整个阵列进行完整排序要好。