为什么使用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
答案 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
或正确插入元素(有emplace
,push
等多种方式。)
示例:
#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;
}