与pair <float,int>进行push_back交互时的困惑

问题描述

我没有错误消息,而是只有意外的行为。

double get_optimal_value(int capacity,vector<int> weights,vector<int> values) {
  int n = weights.size();
  vector<pair<double,int>> valuePerWeight(n);
  pair<double,int> x;
  for(int i = 0; i < n; i++){ 
    double v = values[i]/weights[i]; 
    x = make_pair(values[i]/weights[i],weights[i]);
    valuePerWeight.push_back(x);
  }

  for(int i = 0; i < n && capacity > 0; i++){
    int amount = min(capacity,valuePerWeight[i].second);
    value += valuePerWeight[i].first * amount;
    capacity -= amount;
  }

  double value = 0.0;
  return value;
}

我正在创建一个值为pair<double,int>类型的向量。我使用make_pair(some_double,some_int)创建一个配对,然后用该配对调用push_back

稍后,我在向量中建立索引并使用这些对进行填充。 但是,当我索引到valuePerWeight向量并检索不同对的属性时,就会出现问题。无论索引如何,.first还是.second,它们最终都为零。

通过打印一堆变量,我断言所创建的对不是{0,0},而是一旦我push_back进入向量并为该对建立索引并查看它的.first和{ {1}}属性都等于0。

我似乎不明白为什么会这样,最初我使用的是.second,如下所示:

push_back

而不是创建一个临时变量valuePerWeight.push_back(make_pair(values[i]/weights[i],weights[i])); 。但是,同样的问题仍然存在。

任何对正确方向的帮助将不胜感激。 如果需要进一步说明,请询问我。

如果您想在下面查看某些值,请参见以下代码

我使用输入

x
3 50 
60 20
100 50
120 30

解决方法

这里的困惑是由于您使用的构造函数的行为

vector<pair<double,int>> valuePerWeight(n);

这实际上用n个默认构造的对填充矢量,您可能会猜到它们是(0,0)。当您push_back推到这些末尾时,就完全得到2n对。

.reserve的性能接近您的预期,实际上并未填充矢量,但对于矢量大小调整中的瓶颈,则可能不需要。

短篇小说,省略(n)只是构建一个空向量。

另外三个建议:将向量作为const&来保存副本,然后查看emplace_back而不是自己配对并推动它。这就是它的意思。另外,请注意用churill作注释-将两个整数相除将导致整数除法,无论您将结果分配在何处。静态将其中之一转换为浮点或双精度(或在开始时乘以1.0)以确保浮点除法。