#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(-1.0, 1.0);
std::vector<float> s;
s.reserve(10);
for (int i=0; i< 10; ++i) s[i] = dis(gen);
for (int i=0; i< 10; ++i) std::cout << s[i] << " ";
std::cout << std::endl;
std::sort(s.begin(), s.end());
for (int i=0; i< 10; ++i) std::cout << s[i] << " ";
std::cout << std::endl;
}
输出是: 0.459711 0.0240773 -0.395009 0.574655 -0.244166 -0.343489 -0.520125 0.746452 0.858716 0.765223 0.459711 0.0240773 -0.395009 0.574655 -0.244166 -0.343489 -0.520125 0.746452 0.858716 0.765223 std :: sort无法正常工作!
答案 0 :(得分:3)
.reserve
不会调整向量的大小,因此执行s[i]
是未定义的行为。您必须使用.resize
或使用push_back
插入元素。
.reserve
.begin()
仍然等于.end()
(如在空向量中),这意味着std::sort
将无效。
答案 1 :(得分:3)
reserve
不会自动将矢量内部大小设置为您指定的内容。它所做的就是将其内部阵列的容量改为10,同时其大小保持不变。
当s[i]
大于或等于向量的大小时调用i
将给出未定义的行为。
要解决此问题,请更改
s[i] = dis(gen);
至
s.push_back(dis(gen));