C++ - 如何在结构向量中找到结构的一个成员的最大值?

Had*_*had 0 c++ struct vector

我有一个结构体,它有一个名为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;
}
Run Code Online (Sandbox Code Playgroud)

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

for*_*818 6

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

std::max_element让您选择一个比较,因此您可以id轻松地进行比较:

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

您提到了*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;
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

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

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


归档时间:

查看次数:

1057 次

最近记录:

5 年,9 月 前