std :: vector使struct排序慢吗? C ++

时间:2014-08-08 13:18:58

标签: c++ sorting vector struct

我有一个结构列表,我正在由其中一个成员排序。我正在使用std :: sort和我自己的比较函数,那部分没问题。但是,当我从以下位置更改结构时,我注意到(非常)大的性能差距:

struct square
{
    float x;
    float y;
    float z;

    float scale;
    float angle;

    GLuint texture;
};

struct square
{
    float x;
    float y;
    float z;

    float scale;
    float angle;

    GLuint texture;
    std::vector <float> color;
};

我已经使用了一种完全不同的方法,我意识到使用这样的矢量是一个坏主意(我知道数组的大小 - rgb),但我想知道为什么我的性能受到了影响。我正在比较z值以进行排序。

这是我的排序函数和结构列表:

std::vector <square> square_list;
//Then add a bunch of squares

bool sort (square a,square b)
{
   return a.z < b.z;
}

//Here is the sort that is slow
std::sort (square_list.begin(),square_list.end(),sort);

我想知道它是否与重新排序结构列表有关,因为它们的大小在第二种情况下要大得多?

感谢您的回复。

4 个答案:

答案 0 :(得分:7)

bool sort (square a,square b)

每次复制结构,包括向量。复制比正常数组复制得慢。你应该改用它。

bool sort (const square& a, const square& b)

如果您使用的是C ++ 11,则可以使用std::array替换向量,因为大小是常量。

答案 1 :(得分:0)

每次都复制你的值并且std :: vector预分配一堆内存。复制时间量更大

答案 2 :(得分:0)

除了将参数作为const ref之外,您还可以使用仿函数进行比较。这通常更快,因为仿函数更容易内联。

std::vector <square> square_list;
//Then add a bunch of squares

struct sort
{
  bool operator() (const square& a, const square& b) const {
    return a.z < b.z;
  }
}

std::sort (square_list.begin(),square_list.end(),sort);

答案 3 :(得分:-3)

您是否尝试在向量中存储指针而不是整个结构?

std::vector <square*> square_list;
//Then add a bunch of squares

bool sort (square* a,square* b)
{
   return a->z < b->z;
}

//Here is the sort that is slow
std::sort (square_list.begin(),square_list.end(),sort);