【问题标题】:How to iterate a map of type <string,long>?如何迭代 <string,long> 类型的映射?
【发布时间】:2021-02-28 11:55:02
【问题描述】:
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> >}')

【问题讨论】:

  • 请分享您的完整代码,因为很难理解 c、itr 和 name 是什么
  • 看起来你的地图类型实际上是map&lt;string, int&gt;

标签: c++ maps operator-keyword


【解决方案1】:

当您初始化变量时,您忘记设置“iter”的类型。所以,应该是

map<string, long>::iterator iter = phonebook.begin();

但是,以这种方式初始化迭代器非常耗时。因此,按照目前的标准,最好实现“auto”关键字

auto iter = phonebook.begin();

“auto”将根据表达式右侧的类型设置给定变量的类型。
为了让它更好,你可以使用大括号初始化

auto iter { phonebook.begin() };

【讨论】:

  • "当您初始化变量时,您忘记设置“iter”的类型" - 不,他们没有。 map&lt;string,long&gt;::iterator iter; iter=phonebook.begin(); 作为单独的语句完全有效。真正的问题是map&lt;string,long&gt; 是错误的容器类型。使用auto 可以解决这个问题。
【解决方案2】:

从错误消息中可以清楚地看出,您的phonebook 没有声明为map&lt;string,long&gt;,而是实际上声明为map&lt;string,int&gt;,因此您需要相应地更改迭代器的声明:

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&lt;string,long&gt;map&lt;string,int&gt; 是不同的容器类型。您不能混合来自不同容器类型的迭代器。

更好的解决方案是使用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'ing,因此您应该考虑使用标准的 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2013-09-22
    • 2016-12-21
    • 2011-05-29
    相关资源
    最近更新 更多