当使用std :: vector :: reserve时,std :: sort顺序是从最大到最小?

时间:2015-05-26 10:14:53

标签: c++

为什么使用vector :: reserve会改变sort的行为?

std::vector<unsigned> xyz;
xyz.reserve(3);
xyz[0]=3; xyz[1]=1; xyz[2]=2;
std::sort(xyz.begin(), xyz.end());
std::cout<<xyz[0]<<xyz[1]<<xyz[2]<<"\n";
//312

xyz.clear();
xyz.push_back(3); xyz.push_back(1); xyz.push_back(2);
std::sort(xyz.begin(), xyz.end());
std::cout<<xyz[0]<<xyz[1]<<xyz[2]<<"\n";
//123

3 个答案:

答案 0 :(得分:2)

我在您的代码中添加了一些评论:

slider

答案 1 :(得分:2)

此代码段

std::vector<unsigned> xyz;
xyz.reserve(3);
xyz[0]=3; xyz[1]=1; xyz[2]=2;

无效。如果向量的元素不存在,则不能使用下标运算符。成员函数保留不会创建向量的元素。它只为未来元素保留内存。在这种情况下,您必须使用push_back而不是下标运算符。或者您可以使用成员函数resize代替保留。相反保留它确实创建了向量的指定数字元素。例如

std::vector<unsigned> xyz;
xyz.resize(3);
xyz[0]=3; xyz[1]=1; xyz[2]=2;

答案 2 :(得分:2)

没有。它与它无关。您将使用您的代码进入未定义的行为。

预订不允许您像在此处一样直接使用预留空间:

xyz.reserve(3);
xyz[0]=3; xyz[1]=1; xyz[2]=2;

它确保在插入元素时不会重新分配。你没有插入它们,你使用了跳过分界检查的语法。因此,容器不知道元素在那里。

您可以使用at()这是operator[]的分界检查版本,它会爆炸。

执行此操作的正确方法是resize或正确插入元素(有emplacepush等多种方式。)

示例:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    std::vector<unsigned> xyz;
    xyz.reserve(3); // blows
    // xyz.resize(3);  // works
    xyz.at(0)=3; xyz.at(1)=1; xyz.at(2)=2;
    return 0;
}