在vector <vector <int>&gt;中找到最大值没有for循环

时间:2016-03-25 21:20:31

标签: c++

我们知道,对于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());

4 个答案:

答案 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 。但它完成了它所说的。