【问题标题】:vector <pair<int,int>>v(size); showing 0 as values when printed向量<对<int,int>>v(大小);打印时显示 0 作为值
【发布时间】:2019-04-10 13:48:44
【问题描述】:

C++:vector&lt;pair&lt;int,int&gt;&gt;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

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

【问题讨论】:

  • v.push_back(make_pair(p,q)) 替换为v[i] = make_pair(p,q)。或将vector&lt;pair&lt;int,int&gt;&gt;v(x); 替换为vector&lt;pair&lt;int,int&gt;&gt;v; v.reserve(x);
  • @LakshayGarg 我个人更喜欢后一种方法,它(通常)效率更高。

标签: c++ vector c++14 c++17


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    因为元素是一对int,所以两个选项都不错。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      相关资源
      最近更新 更多