映射迭代器不可取消引用

map iterator not dereferencable

本文关键字:引用 可取消 不可取 迭代器 映射      更新时间:2023-10-16

我收到编译错误"map/set"迭代器不可解引用。这里发生了什么?

#include<iostream>
#include<map>
using namespace std;
int main(){
    map<int, int> m;
    map<int, int>::iterator itr=m.begin();
    itr->first = 0;
    itr->second = 0;
    cout << itr->first << " " << itr->second;
    return 0;
}

映射为空,因此m.begin()等于过去的结束迭代器,因此无效。

您首先必须以某种方式使用insert元素(您也可以通过使用operator[]隐式地这样做),以使其有用。

此外,不能像这样修改元素的键。您必须从映射中移除(erase)元素,并使用新键插入一个新元素。

这里有一个例子:

#include<iostream>
#include<map>
using namespace std;
int main(){
    map<int, int> m;
    // insert element by map::insert
    m.insert(make_pair(3, 3));
    // insert element by map::operator[]
    m[5] = 5;
    std::cout << "increased values by one" << std::endl;
    for(map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
    {
        it->second += 1;
        cout << it->first << " " << it->second << std::endl;
    }
    // replace an element:        
    map<int, int>::iterator thing = m.find(3);
    int value = thing->second;
    m.erase(thing);
    m[4] = value;
    std::cout << "replaced an element and inserted with different key" << std::endl;
    for(map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
    {
        cout << it->first << " " << it->second << std::endl;
    }
    return 0;
}

您的map是空的!迭代器指向的是未定义的。

你想做的是

int main(){
    map<int, int> m;
    m[0] = 0;
    map<int, int>::iterator itr=m.begin();
    cout << itr->first << " " << itr->second;
    return 0;
}

这里没有分配任何值。并且您不能更改它的itr->first的密钥。它只能是只读的。但您可以编辑itr->second

map<int, int> m;
    m[10]=0;
    map<int, int>::iterator itr=m.begin();

      itr->second=10;
    cout << itr->first << " " << itr->second;