繁体   English   中英

C ++ map迭代器问题

[英]C++ map iterator issue

我在以下代码中有一个奇怪的错误:

float Student::getAverageMark() const throw (NoMarkException)
{
    int sum = 0;
    int count = 0;
    for(map<string, float>::iterator iter = marks.begin(); iter != marks.end(); ++iter) {
        sum += iter->second;
        count++;
    }
    return sum/count;
}

正如您所看到的,它没有什么不同寻常的,它是一个计算地图中平均标记的简单代码。 我在一个在线编译器中对它进行了测试并且它有效,但是当我尝试在我的机器上编译它时(我正在使用带有GNU GCC编译器的CodeBlocks)我收到此错误:

错误:从'std :: map,float> :: const_iterator {aka std :: _ Rb_tree_const_iterator,float >>}'转换为非标量类型'std :: map,float> :: iterator {aka std :: _ Rb_tree_iterator, float >>>''request |

你有一个const函数试图迭代我假设的成员变量(标记)。 确保使用const迭代器:

for(map<string, float>::const_iterator iter = marks.begin();

另一个答案显示了如何修复错误,但这是使用std::accumulate计算平均值的另一种方法。 使用此方法,您无需担心迭代器类型等,也可以消除循环。

float Student::getAverageMark() const throw (NoMarkException)
{
    if(marks.empty()) {
        return 0;
    }
    return std::accumulate(marks.begin(), marks.end(), 0.0f,
                           [](float acc, decltype(marks)::value_type const& elem) {
                              return acc + elem.second;
                           }) / marks.size();
}

此外,不推荐使用异常规范

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM