[英]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_files
是const
,那么
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.