我想知道是否有一种简洁的方法来查找元组向量中的一个元素的最大值。例如对于以下内容,假设我想在元组向量中找到元组的最大第二个值。
vector<tuple<int, int>> foo = { {12,1},{12,5},{5,6} };
结果应为6。
我可以这样做的一种方式是:
vector<double> allFoo;
for (int i = 0; i != size(foo); i++) {
allFoo.emplace_back(get<1>(foo[i]));
}
double maxVal = *max_element(allFoo.begin(), allFoo.end());
我觉得,因为你基本上是在迭代两次,这可以更简单地完成吗?
我的元组技能有点受限,看起来你应该可以直接在foo上做某种max_element ......
答案 0 :(得分:11)
一次性使用自定义比较器:
std::vector<std::tuple<int, int>> foo = { {12,1},{12,5},{5,6} };
const auto less_by_second = [](const auto& lhs, const auto& rhs)
{ return std::get<1>(lhs) < std::get<1>(rhs); };
const double maxVal = std::get<1>(*std::max_element(foo.begin(), foo.end(), less_by_second));
答案 1 :(得分:8)
将max_element
与自定义谓词一起使用:
auto maxVal = get<1>(*max_element(foo.begin(), foo.end(),
[](auto& l, auto& r) {return get<1>(l) < get<1>(r);}));
答案 2 :(得分:0)
具有结构化绑定的版本:
std::vector<std::tuple<int, int>> tv = { {12, 1}, {13,2}, {11, 1} };
auto [max1, max2] = *max_element(begin(tv), end(tv), [](auto &lhs, auto &rhs) -> int {return std::get<1>(lhs) < std::get<1>(rhs); });
cout << max2 << endl;