C++ 向量<;配对<;int,int>&燃气轮机;v(尺寸);打印时将0显示为值

C++ 向量<;配对<;int,int>&燃气轮机;v(尺寸);打印时将0显示为值,c++,vector,c++14,c++17,C++,Vector,C++14,C++17,C++:vectorv(大小)将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)); } 但是,当我不声明向量的大小时,它

C++:
vectorv(大小)将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));
}
但是,当我不声明向量的大小时,它会毫无错误地打印输出,这是为什么呢? i、 e

intx;
cin>>x;
向量//未声明大小。
对于(inti=0;i>p>>q;
v、 推回(形成一对(p,q));
}
I/P->
3.
1 2
3 4
5 6
O/P->
1 2
3 4
5 6

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

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

请注意,STL措辞中的“尺寸”一词指的是已插入/包含的元件数量,无需重新分配即可容纳的元件总数称为“容量”

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

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

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

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

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

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


保留更快,类似数组的访问更通用。

Replace
v.push_-back(make_-pair(p,q))
with
v[i]=make_-pair(p,q)
vectorv(x);
替换为
vectorv;v.Reserve(x);
@LakshayGarg我个人更喜欢后一种方法,它(通常)更有效。
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
std::vector<std::pair<int,int>> v;
v.reserve(x);