我有一个元组向量。
伪:
vector<(x, x)>
两个x代表两个不同的值。我想要做的是找到整个向量中具有最大值的x。
代码:
#include <iostream>
#include <vector>
#include <tuple>
int main() {
//Making vector
std::vector<std::tuple<int, int>> v;
//Adding one random tuple to it
v.push_back(std::make_tuple(1,50));
//Getting biggest value in the vector
int bufferMax = 0;
for (auto i : v) {
for (int j = 0; j < 2; j++) {
int nrToTest = std::get<0>(i);
if (j == 1) std::get<1>(i);
if (nrToTest > bufferMax) bufferMax = nrToTest;
}
}
//Output biggest
std::cout << bufferMax << std::endl;
}
输出:1
在第一个循环中,我循环遍历向量中的所有元组,而不是第二个循环在值0和1之间振荡。如果该值为0,我将元组i中的第一个元素与缓冲区进行比较,否则为第二个元组中的元素 但是,此代码无法正常工作,您可以在输出中看到。
为什么这个算法不起作用?
我找到了另一种可行的算法(我猜)
int bufferMax = 0;
for (auto i : v) {
//Biggest tuple value:
int nrToTest = std::get<0>(i);
if (std::get<0>(i) < std::get<1>(i)) {
nrToTest = std::get<1>(i);
}
if (nrToTest > bufferMax) bufferMax = nrToTest;
}
但我仍然想知道为什么第一个不起作用?
答案 0 :(得分:2)
这取决于您如何定义最大值。在第一个代码段中,您只比较每个元组的第一个值:
int bufferMax = 0;
for (auto i : v) { // Iterate over all elements
for (int j = 0; j < 2; j++) {
int nrToTest = std::get<0>(i); // Get the first entry in the tuple
if (j == 1) std::get<1>(i); // This is useless: you get the second value
// in the tuple but you don't do anything with it.
if (nrToTest > bufferMax) // You update the max, but nrToTest
// is always the first value in the tuple
bufferMax = nrToTest;
}
}
第二个代码段有效,因为在每次迭代时,您将nrToTest
设置为元组中最大的条目,然后将其与全局最大值进行比较。
答案 1 :(得分:1)
此代码段(按第一个元素排序)有效:
std::vector<tuple<int, int>> vec;
使用std :: max_element
进行排序auto result = std::max_element(vec.begin(), vec.end(), [](const std::tuple<int, int>& lhs, const std::tuple<int, int>& rhs)
{
return std::get<0>(lhs) < std::get<0>(rhs);
});
使用std :: tie获取结果:
int a, b;
std::tie(a,b) = *(result);
std::cout << a << " " << b << std::endl;