如何在 std::vector<std::pair<int, int>> 中在任一轴上查找 std::max_element?

7

如何在这个对向量 std::vector<std::pair<int, int>> 中找到任何一个轴上的最大元素。

假设这是样本对:

0, 1
0, 2
1, 1
1, 2
1, 4
2, 2
3, 1

我尝试使用std::minmax_element()函数:

const auto p = std::minmax_element(edges.begin(), edges.end());
auto max = p.second->first;

但这只生成第一列的最大元素,即3,但我想要任意一列的最大元素,例如4

我希望最大元素是任意一列中的最高元素。


那么你所说的“both”实际上是指“任意一个”吗? - Lightness Races in Orbit
@LightnessRacesinOrbit 是的。 - Approachable
2个回答

9

使用带有自定义比较函数的std::max_element,例如:

auto max_pair = *std::max_element(std::begin(edges), std::end(edges), 
    [](const auto& p1, const auto& p2) {
        return std::max(p1.first, p1.second) < std::max(p2.first, p2.second);
    });
int max = std::max(max_pair.first, max_pair.second);

1
只是一个小语法问题,在第一行末尾添加 ); 即可。感谢你的解决方案。 - Approachable

6
您需要提供谓词来定义您项目的“较小”关系:
const auto p = std::minmax_element(
        edges.begin(), edges.end(),
        [](const auto& a, const auto& b) {
    // provide relation less you need, example:
    return std::max(a.first, a.second) < std::max(b.first, b.second);
});

默认情况下(在您的代码中),使用less运算符。对于std::pair,它按元素的字典序排序(如果第一个元素较小,则返回true;如果它们相等,则检查second元素是否较小)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接