映射迭代器不可取消引用
map iterator not dereferencable
我收到编译错误"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;
相关文章:
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用运算符不能重载
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- 升压::可选<bool>取消引用
- C++如何将类方法传递给要求引用可调用的函数
- 结构引用和取消引用运算符
- 使用引用和取消引用运算符读取代码行时遇到问题
- 如何确定类型在 C++03 中是否可取消引用
- 我们应该在通过引用之前取消引用指针吗
- 数组迭代器不是可取消引用的错误
- 取消引用指向取消引用类中的函子的指针
- C++/CLI 项目如何引用可移植类库
- 如何在 boost::asio 线程池中使任务可取消/可中断
- 迭代器不是可取消引用的堆栈(表达式树)和循环无法正常工作
- 如何使用boost::expression-static在语义操作中引用可选子匹配
- 何时引用和取消引用具有成员函数的指针
- 列出迭代器而不是可取消引用的运行时
- 为什么持有引用可复制的类