0

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

    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,但我没有得到它。代码编译,我已经包含了所有相关的头文件。请帮帮我!我错过了什么?

4

2 回答 2

1
dist_sort.reserve(5);

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

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

于 2012-09-28T05:50:37.850 回答
1

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

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

要么替换reserve(5)resize(5),要么将元素分配替换为对 的调用push_back()

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

于 2012-09-28T06:03:56.367 回答