在元组向量中找到最大的价值

时间:2018-03-04 01:58:47

标签: c++

我有一个元组向量。

伪:

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;
    }  

但我仍然想知道为什么第一个不起作用?

2 个答案:

答案 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;