![](/img/trans.png)
[英]Array gives correct output for this mergesort function but vector is giving incorrect output. What is going wrong?
[英]Assigning array to std::vector gives incorrect output
#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;
}
上面的代碼輸出:
五
-1073741824
0
-1073741824
-2018993448
而我希望它能輸出
1
2
3
4
五
為什么輸出不正確,我在做什么錯?
當i
大於0時,訪問x[i]
越界,因為x
是一個包含一個值為5(= p[4]
)的向量(= p[0]
)的向量。
這是因為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);
vector<int> x(p[0], p[4]);
並沒有達到您的期望。 它使用p[0]
元素的值p[4]
構造一個vector
。
此std :: vector :: vector的重載將在此處調用。
explicit vector( size_type count,
const T& value,
const Allocator& alloc = Allocator());
如果嘗試cout << x.size();
您會發現vector
的大小為1
,當i > 0
超出范圍並導致UB時, cout << x[i]
。
您可能要調用此重載:
template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
然后將其更改為vector<int> x(&p[0], &p[4]);
。 請注意,這將具有4
元素的構造函數vector
。 vector<int> x(&p[0], &p[5]);
將構造函數vector
與p
所有5
元素一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.