我需要对一个由数字和索引组成的结构进行排序,这样我就可以在排序后检查索引和数字。 我的结构是:
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,但我没有得到它。代码编译,我已经包含了所有相关的标题。请帮帮我!我错过了什么?
答案 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()
永远不会修改可观察状态,只能修改矢量的内部不可见状态。