矢量<pair<int,int>>v(size);打印时显示 0 作为值



C++:当我试图打印出值时,vector<pair<int,int>>v(size);将0显示为值,但当没有声明矢量大小时,它显示的是正确的输出?为什么会这样?例如:

int x;
cin>>x;
vector<pair<int,int>>v(x); //Size declared.
for(int i=0;i<x;i++){
int p,q;
cin>>p>>q;
v.push_back(make_pair(p,q));
}

但当我尝试打印值时,它只打印0。

I/P->  
3
1 2
3 4
5 6
O/P->
0 0
0 0
0 0

但是,当我没有声明向量的大小时,它会在没有任何错误的情况下打印输出,这是为什么?即

int x;
cin>>x;
vector<pair<int,int>>v; //Size is not declared.
for(int i=0;i<x;i++){
int p,q;
cin>>p>>q;
v.push_back(make_pair(p,q));
}
I/P->  
3
1 2
3 4
5 6
O/P-> 
1 2
3 4
5 6

它显示正确的输出。为什么?

这是因为向量的构造函数接受一个整数(类型为size_t(不仅提供了足够的大小,而且创建了x默认对象。然后将新对象附加到这些默认对象上。

请注意,STL措辞中的术语"大小"指的是已经插入/包含的元素数量,可以在不重新分配的情况下保留的元素总数称为"容量"。

如果您想在不创建新对象的情况下预先分配足够的容量,则需要使用reserve:

std::vector<std::pair<int,int>> v;
v.reserve(x);

带有int的向量构造函数意味着它可以创建那么多元素。它们是成对的零。然后你向后推,它会在最后创建新的元素。所以所有元素都是X*2。

我假设您不检查大小,而是列出第一个X元素。

您可以通过vector::reserve(x(或使用[]而不是推回来修复。然后操作看起来更像是数组访问。

因为元素是一对int,所以这两个选项都很好。

Reserve更快,类似阵列的访问更通用。

最新更新