找到两个向量之间的最大元素

时间:2014-10-29 13:03:54

标签: c++

我认为以下内容可行,但只输出零。想法?

std::vector<int> a = { 1, 2, 3 };
std::vector<int> b = { 4, 5, 6 };

int max = *std::max(std::max(a.begin(), a.end()), std::max(b.begin(), b.end()));
std::cout << max;

3 个答案:

答案 0 :(得分:9)

您正在使用std::max,它会比较其参数。也就是说,它返回两个迭代器中较大的一个。

内部调用所需的是std::max_element,它可以找到范围内的最大元素:

std::vector<int> a = { 1, 2, 3 };
std::vector<int> b = { 4, 5, 6 };

int max = std::max(*std::max_element(a.begin(), a.end()), *std::max_element(b.begin(), b.end()));
std::cout << max;

Live example

正如@MikeSeymour在注释中正确指出的那样,上面的代码假定范围不为空,因为它无条件地取消引用从std::max_element返回的迭代器。如果其中一个范围为空,则返回的迭代器将是过去的那个,不能解除引用。

答案 1 :(得分:3)

这是一种在空旷的范围内表现明智的方式。如果任一范围为空,您仍然可以从其他范围获得最大值。如果两个范围都为空,则会得到INT_MIN

int m = std::accumulate(begin(b), end(b),
             std::accumulate(begin(a), end(a), INT_MIN, std::max<int>),
             std::max<int>);

std::accumulate在这里更好,因为你想要一个值,而不是一个迭代器。

答案 2 :(得分:0)

int m = std::max(std::max_element(a.begin(), a.end()), std::max_element(b.begin(), b.end()));

这可以找到各个向量的最大值。例如,对于第一个向量,{1,2,3},最大值为3,对于第二个向量,{4,5,6},最大值为6,最大值为3和6现在为6