#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
为什么输出不正确,我做错了什么?
答案 0 :(得分:3)
当x[i]
大于0时,访问i
超出范围,因为x
是包含一个(= p[0]
)元素值5的向量(= p[4]
)。
这是因为vector<int> v(a, b)
创建了一个带有a
元素的向量,每个元素的值为b
。
要实现您的目标(x
与p
相同),您需要:
#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
元素的构造函数4
。 vector<int> x(&p[0], &p[5]);
将使用vector
中的所有5
元素构造函数p
。