[英]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.