我们知道,对于vector<int> A
,我们可以使用*max_element(A.begin(), A.end())
查找A
中的最大值。但是,我想知道是否有一种干净的方法来查找vector<vector<int>> B
中的最大值,避免使用for
循环?
如果我们使用for
循环,代码可能很简单,如:
int maxvalue = INT_MIN;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
maxvalue = max(maxvalue, B[i][j]);
或
int maxvalue = INT_MIN;
for (int i = 0; i < m; i++)
{
int temp = *max_element(B[i].begin(), B[i].end());
maxvalue = max(maxvalue, temp);
}
但我仍觉得它不够干净。我不喜欢for
循环。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最后,我选择了以下代码来执行此操作:
auto itv = max_element(A.begin(), A.end(), [](vector<int>& a, vector<int>& b)
{ return *max_element(a.begin(), a.end()) < *max_element(b.begin(), b.end()); });
int ans = *max_element(itv->begin(), itv->end());
答案 0 :(得分:4)
auto max_value = std::accumulate(std::begin(B), std::end(B),
std::numeric_limits<int>::min(),
[] (int cur_max, auto && vec)
{
return std::max(cur_max, *std::max_element(std::begin(v), std::end(v));
});
答案 1 :(得分:0)
您可以使用for
代替std::for_each
循环。也许是这样的:
int maxvalue = std::numeric_limits<int>::min();
std::for_each(std::begin(B), std::end(B), [&maxvalue](const auto& v)
{
maxvalue = std::max(maxvalue, *std::max_element(std::begin(v), std::end(b)));
});
答案 2 :(得分:0)
如果要避免使用循环的东西是程序中的长结构,使用 c ++ 11 ,您可以在一行中找到最大值 with loops :
std::vector< std::vector<int> > w;
int max = 0;
for (auto i : w) for (auto j : i) max = j > max ? j : max;
或者
int max = 0;
for (auto i : w) for (auto j : i) if (j > max) max = j;
无论如何,我认为这不是一个好习惯。这个选项会更好:
int max = 0;
for (auto i : w)
for (auto j : i)
max = j > max ? j : max;
答案 3 :(得分:0)
我在max_element()
中使用了自定义比较运算符来获得所需的效果。除了max_element()
运行的隐含累积外,没有任何循环。
bool mycomp(vector<int> a, vector<int> b) {
return *max_element(a.begin(), a.end()) < *max_element(b.begin(), b.end());
}
vector<vector<int>> vv; // our vector of vectors
auto itv = max_element(vv.begin(), vv.end(), mycomp); // find the vector
// with the max element
int answer = *max_element((*itv).begin(), (*itv).end()); // finds the max element
// in the desired vector
这绝不是 clean 。但它完成了它所说的。