簡體   English   中英

如何迭代 map 類型<string,long> ?</string,long>

[英]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;
    }

longint是不同的類型,因此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM