当输入向量调用reserve时,std :: sort无法工作

时间:2017-12-11 02:24:59

标签: c++ sorting c++11 std

#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无法正常工作!

2 个答案:

答案 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));