对 push_back 与 pair<float,int> 互动的困惑
Confusion on push_back interaction with pair<float,int>
我没有收到任何错误消息,只有意外行为。
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
和 .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
个默认构造的对填充向量,正如您所猜测的那样,它们是 (0, 0)。当你 push_back
时,你推到这些的末尾,所以你总共得到 2n
对。
.reserve
做了一些接近您预期的事情,实际上并没有填充向量,但可能不需要 bottle-necking 调整向量大小的东西。
简而言之,省略 (n)
仅构造一个空向量。
另外三点建议:接受向量为const&
保存一份,看emplace_back
而不是自己做一对推。这就是它的意义。另外,请注意 的注释 - 无论您在何处分配结果,除以两个整数都会导致整数除法。将其中之一静态转换为浮点数或双精度数(或在开始时乘以 1.0)以确保浮点除法。
我没有收到任何错误消息,只有意外行为。
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
和 .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
个默认构造的对填充向量,正如您所猜测的那样,它们是 (0, 0)。当你 push_back
时,你推到这些的末尾,所以你总共得到 2n
对。
.reserve
做了一些接近您预期的事情,实际上并没有填充向量,但可能不需要 bottle-necking 调整向量大小的东西。
简而言之,省略 (n)
仅构造一个空向量。
另外三点建议:接受向量为const&
保存一份,看emplace_back
而不是自己做一对推。这就是它的意义。另外,请注意