【问题标题】:C++ - How to find the maximum of one member of struct in a vector of structs? [duplicate]C++ - 如何在结构向量中找到一个结构成员的最大值? [复制]
【发布时间】:2020-02-11 19:38:21
【问题描述】:

我有一个结构,它有一个名为id 的成员。

struct st
{
    int id;
    double d;
};

st s1 = {1, 5.6};
st s2 = {2, 5.7};
st s3 = {3, 4.3};

vector<st> vec;
vec.push_back(s1);
vec.push_back(s2);
vec.push_back(s3);

int max = 0;
for(int i=0; i < vec.size(); i++)
{
    if(vec[i].id > max)
        max = vec[i].id;
}

如何在不使用 for 循环的情况下找到这些结构的向量中的最大 id?我看到this answer 但不明白。 有没有更有效的方法使用*max_element

【问题讨论】:

标签: c++ vector struct


【解决方案1】:

您链接的答案是关于在向量中搜索满足给定条件的元素。找到最大值是不同的,因为在知道最大元素之前必须考虑所有元素。

std::max_element 让您选择比较,因此您可以轻松地仅比较id

auto max = *std::max_element(vec.begin(),
                             vec.end(),
                             [](const st& a,const st& b) { return a.id < b.id; });                 

您提到了*max_element,因此我想您知道它返回一个可以取消引用的迭代器。但是,请注意,如果容器为空,则上述内容将中断(由于取消引用 end 迭代器而导致的未定义行为),更安全的方法是:

auto it = std::max_element(vec.begin(),
                             vec.end(),
                             [](const st& a,const st& b) { return a.id < b.id; });                 
if (it == vec.end()) throw "max_element called on emtpy vector";
auto max = *it;

附言

[...] 不使用 for 循环?

不要混淆使用“无循环”的算法。上面的链接有一个可能的实现,如果你研究它,你会发现它不是魔法,而只是一个简单的循环。该算法的优点是表达能力强,出错的可能性较小。

【讨论】:

  • 谢谢!很有帮助的答案。如果它为空,我会在之前添加一个条件以避免运行它,因为我不希望程序停止。
  • @HadiGhahremanNezhad 当然,如果您知道向量不是空的,则不必检查两次。为了完整起见,我主要包括它
猜你喜欢
  • 2014-05-28
  • 2021-12-21
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多