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

时间:2014-02-13 18:16:23

标签: c++ arrays sorting struct

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

为了绘制粒子,我必须得到所有位置的数组,如此...

b2Vec2* particlePositionBuffer = world->GetParticlePositionBuffer();

这将返回一个b2Vec2对象数组(表示物理引擎中的2维向量) 我也可以使用

来设置颜色
  b2ParticleColor* particleColourBuffer = world->GetParticleColorBuffer();

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

我的想法是...... 1.创建一个与particlePositionBuffer数组大小相同的结构数组,结构只包含一个int(particlePositionBuffer数组中的粒子索引)和一个浮点数(粒子y位置)
然后我按y位置对数组进行排序 然后我在结构数组中前10%结构的结构中使用int来在particleColourBuffer数组中将它们的颜色添加到它们的颜色中。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

二叉搜索树具有快速插入,快速搜索和维护订购的优点。如果你想 FAST ,这比整个数组上的完整排序要好。

答案 1 :(得分:1)

以下可能会有所帮助:

// 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])
    }
}