c++ - push_back 与 pair<float,int> 交互的困惑

标签 c++ vector 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> 的 vector .我使用 make_pair(some_double, some_int) 创建了这对,然后我调用push_back与这对。
稍后在函数中,我对 vector 进行索引并使用对进行处理。
然而,当我索引到我的 valuePerWeight 时,出现了一个问题。 vector 并检索不同对的属性。无论索引如何,无论.first如何,它们最终都为零。或 .second .
通过打印一堆变量,我断言创建的对不是 {0,0},而是我 push_back进入 vector 并索引这对并查看它的.first.second属性都等于0。
我似乎无法理解为什么会这样,最初我使用的是 push_back如下所示
valuePerWeight.push_back(make_pair(values[i]/weights[i], weights[i]));
而不是创建一个临时变量x .然而,同样的问题仍然存在。
任何正确方向的帮助将不胜感激。
如果有任何进一步的澄清,我可以给,请问我。
如果您想查看下面的某些值是可以编译的片段
我使用输入
3 50 
60 20
100 50
120 30
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

double get_optimal_value(int capacity, vector<int> weights, vector<int> values) {
  double value = 0.0;
  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];
    cout << v << ' '<< weights[i] << '\n';
    x = make_pair(values[i]/weights[i], weights[i]);
    cout << x.first << ' ' << x.second << '\n';

    valuePerWeight.push_back(x);
    cout << valuePerWeight[i].first << ' ' << valuePerWeight[i].second << '\n';
  }


  for(int i = 0; i < n; i++){
    cout << valuePerWeight[i].first;
    cout << valuePerWeight[i].second;

    cout << '\n';
  }

  sort(valuePerWeight.begin(), valuePerWeight.end());

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



  // for(auto vp: valuePerWeight){
  //   cout << vp.first << vp.second;
  //   cout << '\n';
  // }

  return value;
}

int main() {
  int n;
  int capacity;
  std::cin >> n >> capacity;
  vector<int> values(n);
  vector<int> weights(n);
  for (int i = 0; i < n; i++) {
    std::cin >> values[i] >> weights[i];
  }

  double optimal_value = get_optimal_value(capacity, weights, values);

  std::cout.precision(10);
  std::cout << optimal_value << std::endl;
  return 0;
}

最佳答案

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

vector<pair<double, int>> valuePerWeight(n);
这实际上用 n 填充 vector 您可能猜到的默认构造对是 (0, 0)。当你push_back ,你把这些推到最后,所以你完全得到2n对。.reserve做一些接近你预期的事情,实际上并没有填充 vector ,但可能不需要在 vector 调整大小上没有瓶颈的事情。
短篇小说,省略(n)只是构造一个空 vector 。
另外三个建议:接受 vector 为 const&保存拷贝,然后查看 emplace_back而不是自己制作一对并插入它。这就是它的意义所在。另外,请注意 churill 的评论- 将两个整数相除将导致整数除法,无论您在何处分配结果。静态将其中一个转换为浮点数或 double 数(或在开始时乘以 1.0)以确保浮点除法。

关于c++ - push_back 与 pair<float,int> 交互的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63555303/

相关文章:

c++ - 构造函数不更新类成员变量

c++ - 为什么当我试图返回一个 const 引用时会出现 vector 复制?

c++ - 基本迭代器 C++ 如何迭代 vector 数组

c++ - 将变量推回 vector

c++ - 为什么锁会起作用?

c++ - DXUT 配置

c++ - push_back 上的段错误

c++ - vector 的 vector push_back

c++ - QComboBox 子类中的断点不起作用

c++ - 为什么 vector 的容量和大小不同?