Structs的向量不是排序C ++

时间:2012-09-28 05:47:43

标签: c++ sorting struct

我需要对一个由数字和索引组成的结构进行排序,这样我就可以在排序后检查索引和数字。 我的结构是:

    struct data{
     float   number;
      size_t index;
      };

    //My sorting function is:
     bool by_number( const data& left, const data& right)
               {
               return (left.number < right.number);
    }

   // My code to sort is:
    std::vector<data>dist_sort;
    dist_sort.reserve(5);
    dist_sort[0].number=33;
    dist_sort[1].number=36;
    dist_sort[2].number=12;
    dist_sort[3].number=103;
    dist_sort[4].number=233;

    dist_sort[0].index=1;
    dist_sort[1].index=2;
    dist_sort[2].index=3;
    dist_sort[3].index=4;
    dist_sort[4].index=5;

    std::sort(dist_sort.begin(),dist_sort.end(),by_number);

    cout<<dist_sort[0].number<<endl;
    cout<<dist_sort[0].index<<endl;

我希望输出为12和3,但我没有得到它。代码编译,我已经包含了所有相关的标题。请帮帮我!我错过了什么?

2 个答案:

答案 0 :(得分:1)

dist_sort.reserve(5);

将保留足够的空间,但元素实际上并未构建。这是错误的。

您需要resize。或者只使用push_back,而不是operator[]

答案 1 :(得分:1)

您使用std::vector错误。 reserve仅为进一步插入保留内存,它不会更改向量包含的实际元素的数量(即不会更改size()报告的内容。)

因此,您将大小为0的向量传递给std::sort(),因此它什么也没做。

reserve(5)替换为resize(5),或者通过调用push_back()替换元素分配。

使用reserve()的唯一原因是在插入大量元素时避免重新分配(并因此复制)。 std::vector将元素存储在一个连续的内存块中,因此如果新插入的元素不适合先前分配的块,则必须复制所有元素。每次发生时,std::vector通常会将内存区域的分配大小加倍,这会将插入的平均成本降低到O(n)(从O(n ^ 2)开始,如果复制发生的话,那将是在每个插入时)。但是所有复制的成本仍然很高,例如如果您将数千(或更多)元素插入先前为空的std::vector。在这种情况下,您需要使用reserve()预先为其分配一个所需大小的内存块,然后单个插入只需要存储元素并增加矢量大小。但reserve()永远不会修改可观察状态,只能修改矢量的内部不可见状态。