将数组赋值给std::vector会产生不正确的输出

Assigning array to std::vector gives incorrect output

本文关键字:不正确 输出 vector 数组 赋值 std      更新时间:2023-10-16
#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

而我希望它输出


12
3
4
5

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

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

这是因为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);

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的大小是1, cout << x[i]i > 0超出边界并导致UB。

你可能想要调用这个重载:

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

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