C++求向量的向量的最大值

kuarbcqp  于 2022-12-15  发布在  其他
关注(0)|答案(3)|浏览(304)

我对C++还很生疏,所以想知道是否有更简洁的方法来求向量的向量的最大值。下面是我的想法:

std::vector<std::vector<int>> score;

这个score变量由其他一些代码填充。我希望存储最大值:

int max_value()
{
    std::vector<int> row_maximums;

    for (auto row = score.begin(); row != score.end(); ++row)
    {
        row_maximums.push_back(*std::max_element(row->begin(), row->end()));
    }
    return *std::max_element(row_maximums.begin(), row_maximums.end());
}

我主要是一个C#开发人员,所以通常习惯于在一行中使用LINQ:

List<List<int>> score;

public int max_value => score.Aggregate(0, (current, row) => row.Prepend(current).Max());

谢谢你的建议!

nnvyjq4y

nnvyjq4y1#

假设你能使用C++20,我会简单地写:

auto max_value = std::ranges::max(score | std::views::join);

join将矢量从2d展平为1d,max将提供范围的最大值
工作示例:godbolt.org

xdyibdwo

xdyibdwo2#

int max_value()
{
    int ret = std::numeric_limits<int>::min();
    for (auto& row : score)
    {
        for (auto& j : row) {
            if (j > ret)
                ret = j;
        }
    }
    return ret;
}

只是想表明事情可能比你想象的要简单得多:D
for (auto& row : score) {...}等效于for (auto it = score.begin(); it != score.end(); ++it) { auto& row = *it; ... },但在本场景中更短。(当然,仅从C++11开始可用)

eoxn13cs

eoxn13cs3#

int max_value()
{
    int value = std::numeric_limits<int>::min();
    for (auto &row : score)
    {
        if (!row.empty())
            value = std::max(value, *std::max_element(row.begin(), row.end());
    }
    return value;
}

相关问题