C++ 中常量列表的迭代器<t>

Iterator for const list<t> in C++

本文关键字:lt gt 迭代器 常量 列表 C++      更新时间:2023-10-16

我编写了这个非成员函数,用于查找最大值和最小值为 levelfloat属性)的 member s。我的逻辑是将所有levelvipList 推回向量,并使用 std::max_elementstd::min_element 进行计算,并返回包含这两个值的std::pair

pair<float,float> minMax (const list<member>& vipList){
    vector<float> v(vipList.size());
    for (list<member>::iterator it = vipList.begin(); it!=vipList.end(); ++it) //error
    {
        v.push_back(it->level);
    }
    return std::make_pair(*std::max_element(std::begin(v),std::end(v)),*std::min_element(std::begin(v),std::end(v)));
}

错误消息是:

no suitable user-defined conversion from "std::_List_const_iterator<std::_List_val<std::_List_simple_types<member>>>" to "std::_List_iterator<std::_List_val<std::_List_simple_types<member>>>" exists

所以我list<member>::iterator it改为std::_List_const_iterator<member> it,这也不起作用。如果我从参数中删除const,它会构建,但这不是我想要的。有人可以帮忙吗?谢谢。

由于vipList是一个const list<member>&你需要使用list<member>::const_iterator因为这是begin()将返回的内容。 您还可以使用 auto 并让编译器选择正确的类型。

与其执行所有这些操作,不如使用std::minmax_element它将返回一对迭代器的最小值和最大值。 我们可以使用类似 lambda 的列表来做到这一点

return std::minmax_element(vipList.begin(), vipList.end(), [](const member & lhs, const member& rhs) { return lhs.level < rhs.level; });

这将返回一个std::pair<std::list<member>::const_iterator, std::list<member>::const_iterator>。 如果您希望它返回std::pair<float, float>那么我们需要捕获std::minmax_element的返回并取消引用迭代器以获取底层浮点数。

auto ip = std::minmax_element(vipList.begin(), vipList.end(), [](const member & lhs, const member& rhs) { return lhs.level < rhs.level; });
return std::make_pair(ip.first->level, ip.second->level);