求两个向量之间的最大元素

Find max element between two vectors

本文关键字:之间 元素 向量 两个      更新时间:2023-10-16

我原以为下面的会起作用,但它只输出零。想法?

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;

您使用的是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;

实时示例

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

这里有一种在空范围内表现合理的方法。如果其中一个范围为空,则仍然可以从另一个范围中获得最大值。如果两个范围都为空,则得到INT_MIN

auto op = [](int a, int b) { return std::max(a, b); }; // 1)
int m = std::reduce(begin(b), end(b),
        std::reduce(begin(a), end(a), INT_MIN, op), op);

std::reduce2)在这里更好,因为您想要一个值,而不是迭代器作为结果。


1)我们需要一个lambda包装器,因为我们不允许使用std::max的地址
2)C++-17之前,您可以使用std::accumulate

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