【发布时间】:2018-12-12 11:21:33
【问题描述】:
假设我们有一个向量向量并希望找到一个最小值(或最大值)(无需知道它们在表中的位置)。什么是完成此任务的优雅方式?
下面包含的显而易见的解决方案是在循环中对每一行运行 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;
}
【问题讨论】:
-
问题是算法返回一个迭代器,所以你不能做
std::max_element(begin(array), end(array), 0, [](){}),因为你需要在一个向量上返回一个迭代器,而不是在一个元素上:/ -
使用range-v3,有
ranges::view::join可以将范围范围视为展平范围,那么简单的std::minmax_element就足够了。 -
@Jarod42 有机会根据它得到答案吗?
-
@MatthieuBrucher:不确定 OP 是否可以使用外部库。
-
我会投票给@Jarod42。找到一种通过一个迭代器查看向量向量的方法。这可以通过一些知道所有向量的迭代器来完成。或者你将向量的向量删除为一个简单的向量。