繁体   English   中英

使用迭代的问题 map C++

[英]problem with using Iterating over map C++

我不确定为什么这不是有效的迭代器我的 function 看起来像这样:

int Directory::getSizeOfFiles() const {
    std::map<std::string, int>::iterator it = m_files.begin();
    int total = 0;

    while (it != m_files.end()) {
        total += it->second();
        it++;
    }
    return total;
}

m_files 定义为: std::map<std::string, int> m_files; 在目录 class 中

为什么它会给我错误

error C2440: 'initializing': cannot convert from 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,int>>>>' to 'std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,int>>>>'

visual studio 显示:在此处输入图像描述

我希望这个迭代器能工作。 我想我可以用另一种方式循环 map 但我不确定为什么我所做的不起作用。

m_files必须是该方法的 class 的成员。

现在,请注意这个 class 方法:

int Directory::getSizeOfFiles() const {

坚持在它末尾的const有点重要。

这意味着,就此方法而言,所有 class 成员都是const

如果m_filesconst ,那么

m_files.begin();

返回一个const_iterator ,而不是一个iterator 因此声明必须是:

    std::map<std::string, int>::const_iterator it = m_files.begin();

现在,如果您返回 go,查看编译器的错误消息,真正、非常努力地眯着眼睛,您可能能够弄清楚错误消息的文本所表达的细节。

您可能还想知道您用来学习 C++ 的 C++ 教科书似乎已经过时,而且大部分都已过时。 当前的 C++ 标准提供了更简洁的容器迭代方式,可以自动处理诸如此类的小细节。 您可能想考虑一个等效的、更短的、更清洁的和更简单的替代方案,您同意吗?

int total=0;

for (const auto &[key, value]:m_files)
   total += value;

return total;

您应该能够在涵盖当前 C++ 标准的每本 C++ 教科书中找到对这种最新语法的完整描述。

暂无
暂无

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

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