map迭代器不是dereferencable

时间:2015-11-12 15:05:55

标签: c++ dictionary

我收到编译错误“map / set”迭代器而不是dereferencable“。这里发生了什么?

#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;
}

3 个答案:

答案 0 :(得分:2)

地图为空,因此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;
}

答案 1 :(得分:1)

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

你想做的是

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

    cout << itr->first << " " << itr->second;
    return 0;
}

答案 2 :(得分:1)

此处您尚未指定任何值。并且您无法更改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;