使用STL算法在表格(向量,2D数组)中查找最小值/最大值的绝佳方法

时间:2018-12-12 11:21:34

标签: c++ algorithm stl

让我们假设我们有一个向量向量,并希望找到一个最小(或最大)值(无需知道它们在表中的位置)。有什么优雅的方法可以做到这一点?

一个明显的解决方案,包括在下面,是在循环的每一行中运行std :: min_element。但是是否有可能使用lambda函数使用单个语句而无需循环来做到这一点?

注意,SO上已经有一个类似的问题,但实际上与我在这里问的不完全相同。

更新:理想的解决方案是仅使用STL,但如果失败了,那么看看其他选项会很有趣。

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::vector<std::vector<double> > test_array=
         {
          {1., 2., 3., 4.},
          {7., 4., 6., 8.},
          {5., -1., 3., 1}
         };
    double min_val(test_array[0][0]);
    double max_val(test_array[0][0]);
    for(auto& row : test_array)
    {
        min_val = std::min(min_val, *std::min_element(row.begin(), row.end()));
        max_val = std::max(max_val, *std::max_element(row.begin(), row.end()));
    }

    cout << "Minimum = " << min_val << std::endl;
    cout << "Maximum = " << max_val << std::endl;
    return 0;
}

2 个答案:

答案 0 :(得分:2)

使用range-v3,您可能会看到ranges::view::join的平面化视图:

std::vector<std::vector<double> > test_array =
{
    {1., 2., 3., 4.},
    {7., 4., 6., 8.},
    {5., -1., 3., 1}
};
auto flatten_view = test_array | ranges::view::join;
const auto p = std::minmax_element(begin(flatten_view), end(flatten_view));
std::cout << "Minimum = " << *p.first << std::endl;
std::cout << "Maximum = " << *p.second << std::endl;

Demo

答案 1 :(得分:1)

有多个选项,例如,以下选项使用std::accumulate分别返回一对包含最小和最大元素的数字:

auto res = std::accumulate(a.begin(), a.end(), std::make_pair(a[0][0], a[0][0]),
    [](const auto& current, const auto& v) {
        auto minmax = std::minmax_element(v.begin(), v.end());
        return std::make_pair(std::min(current.first, *minmax.first),
                              std::max(current.second, *minmax.second));
    });

实时演示:https://wandbox.org/permlink/IwMWioewJBg7C67l