如何解决与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)以确保浮点除法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。