使用map迭代器编译错误

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的正确性,这是一件好事:).

  • -.25以杀死小猫的方式使用汽车.;) (2认同)