如何在不迭代的情况下调用数组中每个元素的方法?

时间:2018-07-14 13:56:35

标签: c++ loops for-loop optimization

我正在编写一个小程序,其中有25个点的数组。每个点都有自己的位置,大小和颜色,并且在使用图形库(Allegro)时,我有一种在屏幕上打印它们的方法。

我需要同时打印并使用:

    for (int i = 0; i < m_size ; i++)
    {
        points[i].move();
        points[i].draw();
    }

一个接一个地打印它们。绝对更好的方法是:

    for (int i = 0; i < m_size ; i++)
    {
        points[0].move();
        points[0].draw();
        points[1].move();
        points[1].draw();

        // ...

        points[24].move();
        points[24].draw();
    }

这当然不是最佳解决方案;但效果很好。问题是,有没有办法将第二个选项减少到更少的行数?

编辑:

void Particula::move(){
// Modifies private position attributes.
    m_x += rand() % 50;
    m_y += rand() % 50;
}

void Particula::draw(){
// Draws the point given its private attributes.
    printf("Drawing circle... \n");
    // printf ("[ DEBUG:] X: %f, Y: %f, Radius: %f", m_x, m_y, m_radius);

    al_draw_filled_circle(m_x, m_y, m_radius, m_color); // Draws the point.
    al_flip_display(); // Updates the display.
}

预期结果是:

  1. 点一个接一个地显示。
  2. 绘制全部25个点后,清除显示。
  3. 修改属性以设置新坐标。
  4. 同时重画所有点(或使它们显示在屏幕上)。
  5. 重复多次(也许100或500)。

3 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您的第二个代码块应该只执行一次,没有for循环。否则,将一次又一次打印这些点。

  

绝对更好的是...

根据这种理解,这是“绝对”错误的。您必须编写冗长且可能错误的代码;它没有比for循环版本更优化-如果(它认为)解压缩更好,则普通编译器会解压缩循环。 (通常是正确的),因此不需要手动拆包。

答案 1 :(得分:0)

据我阅读的Allegro文档,渲染似乎是基于类似位图的对象完成的。  因此,您可以尝试先将点绘制到缓冲区位图,例如

BITMAP *bmp = create_bitmap(320, 200); // make a bitmap in RAM
clear_bitmap(bmp); // zero the memory bitmap 
putpixel(bmp, x, y, color); // draw onto the memory bitmap 
blit(bmp, screen, 0, 0, 0, 0, 320, 200); // copy it to the screen 

但对于每个点都使用for循环。

请注意,这只是假设的结果,因为我从未使用过Allegro。

代码从以下位置复制:http://www.allegro.free.fr/onlinedocs/en/index009.html

答案 2 :(得分:0)

像这样修改代码就可以了:

for(int i = 0; i < N; i++) // being N a variable number.
{
    for (int h = 0; h < m_size; h++)
    {
        point[h].move();
        point[h].draw();
    }
    al_flip_display();
    al_clear_to_color(al_map_rgb(0,0,0));
    al_rest(0.1);
}