[英]How to iterate a map of type <string,long>?
map<string,long>::iterator iter; iter=phonebook.begin();
while (iter != phonebook.end()){
if(name==(*itr).first){
cout<<(*itr).first<<"="<<(*itr).second<<endl;
c=1;
break;
}
此代碼引發此錯誤:
[Error] no match for 'operator=' (operand types are 'std::map<std::basic_string<char>, long int>::iterator {aka std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, long int> >}'
and 'std::map<std::basic_string<char>, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, int> >}')
當您初始化變量時,您忘記設置“iter”的類型。 所以,應該是
map<string, long>::iterator iter = phonebook.begin();
但是,以這種方式初始化迭代器非常耗時。 因此,按照目前的標准,最好實現“auto”關鍵字
auto iter = phonebook.begin();
“auto”將根據表達式右側的類型設置給定變量的類型。
為了使它更好,您可以使用大括號初始化
auto iter { phonebook.begin() };
從錯誤消息中可以清楚地看出,您的phonebook
未聲明為map<string,long>
而是實際上聲明為map<string,int>
,因此您需要相應地更改迭代器的聲明:
map<string,int>::iterator iter = phonebook.begin();
while (iter != phonebook.end()) {
if (name == (*itr).first) {
cout << (*itr).first << "=" << (*itr).second << endl;
c = 1;
break;
}
long
和int
是不同的類型,因此map<string,long>
和map<string,int>
是不同的容器類型。 您不能混合來自不同容器類型的迭代器。
更好的解決方案是使用auto
來讓編譯器推斷要使用的迭代器的類型:
auto iter = phonebook.begin();
while (iter != phonebook.end()) {
if (name == itr->first) {
cout << itr->first << "=" << itr->second << endl;
c = 1;
break;
}
然后可以通過使用range-for循環來進一步簡化:
for(const auto &elem : phonebook()) {
if (name == elem.first) {
cout << elem.first << "=" << elem.second << endl;
c = 1;
break;
}
但是,您的循環在第一個匹配元素上是break
,因此您應該考慮使用標准std::find_if()
算法而不是循環,例如:
auto iter = std::find_if(phonebook.begin(), phonebook.end(),
[&](const auto &elem){ return name == elem.first; }
);
if (iter != phonebook.end()) {
cout << iter->first << "=" << iter->second << endl;
c = 1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.