我认为以下内容可行,但只输出零。想法?
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;
答案 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;
正如@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