将数组分配给std :: vector会导致输出错误

时间:2016-09-19 01:22:10

标签: c++

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

int p[5] = {1,2,3,4,5};
vector<int> x(p[0], p[4]);

class Polynomial {    
};

int main(){
    Polynomial Poly;

    unsigned int i;

    for(i = 0;i<=4; i++)
        cout<< x[i]<<endl;

    return 0;


}

以上代码输出:

  

5
  -1073741824
  0
  -1073741824
  -2018993448

我期望它输出

  

1
  2
  3
  4
  5

为什么输出不正确,我做错了什么?

2 个答案:

答案 0 :(得分:3)

x[i]大于0时,访问i超出范围,因为x是包含一个(= p[0])元素值5的向量(= p[4])。

这是因为vector<int> v(a, b)创建了一个带有a元素的向量,每个元素的值为b

要实现您的目标(xp相同),您需要:

#include <iterator>

vector<int> x(std::begin(p), std::end(p))

或者,自己猜测尺寸:

vector<int> x(p, p + 5);

或许有些像C一样:

vector<int> x(p, p + sizeof(p)/sizeof *p);

答案 1 :(得分:1)

vector<int> x(p[0], p[4]);没有达到您的预期。它构造了一个vector p[0]元素,其值为p[4]

此处将调用此std::vector::vector的重载。

explicit vector( size_type count,
                 const T& value,
                 const Allocator& alloc = Allocator());

如果您尝试cout << x.size();,当vector超出限制并导致UB时,您会发现1的大小为cout << x[i]i > 0

您可能想要调用此重载:

template< class InputIt >
vector( InputIt first, InputIt last,
        const Allocator& alloc = Allocator() );

然后将其更改为vector<int> x(&p[0], &p[4]);。请注意,这将是带有vector元素的构造函数4vector<int> x(&p[0], &p[5]);将使用vector中的所有5元素构造函数p