jat*_*iou 8 c++ iterator compiler-errors map
在我的头文件中,我已经包含了std :: map并使用了相应的命名空间.
我的一位成员是:
map<unsigned int, double> pT_Spam;
Run Code Online (Sandbox Code Playgroud)
在我的.cpp文件中,我尝试做一些我经常做一段时间的事情:
for(map<unsigned int, double>::iterator it=pT_Spam.begin() ; it!=pT_Spam.end() ; it++) {/*code*/}
Run Code Online (Sandbox Code Playgroud)
在cplusplus.com上使用std :: map的例子中甚至提到了上述内容.即使我在代码的其他部分中完成了相同的操作,导致没有编译错误,但在这个特定的行上,我从Cygwin得到以下错误:
error: conversion from `std::_Rb_tree_const_iterator<std::pair<const unsigned int, double> >' to non-scalar type `std::_Rb_tree_iterator<std::pair<const unsigned int, double> >' requested
Run Code Online (Sandbox Code Playgroud)
这似乎很奇怪.知道什么可能是错的吗?(我的标题当然包含在我的.cpp中)
Lia*_*m M 16
似乎在这个循环存在的范围内,映射是const.例如,类方法中的循环是否声明为const,就像这样?
void method() const // const method
{
// Do stuff.
}
Run Code Online (Sandbox Code Playgroud)
或作为const参数传递,像这样?
void function(const map<unsigned int, double>& pT_Spam)
{
// Do stuff.
}
Run Code Online (Sandbox Code Playgroud)
如果是,则必须使用const迭代器:
for(map<unsigned int, double>::const_iterator it=pT_Spam.begin() ; it!=pT_Spam.end() ; it++)
{
/*code*/
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用的是C++ 11,那么您应该使用auto关键字:
for(auto it=pT_Spam.begin() ; it!=pT_Spam.end(); it++)
{
/*code*/
}
Run Code Online (Sandbox Code Playgroud)
因为在您展示的情况下必须使用const迭代器,所以不能使用它们来修改地图或其中的数据.这是const的正确性,这是一件好事:).