为什么我不能将const映射结构传递给c ++中的函数?

10 c++ const map

我试图传递const与矢量它的工作原理:例如:

void damn(const vector <bool> &bb)
{
    for (int i=0; i<bb.size(); i++)
        cout<<bb[i]<<endl;

}
Run Code Online (Sandbox Code Playgroud)

但是在尝试使用地图时,它不会:

void pas(const map <string, float> &mm)
{
    cout<<mm["a"];
    cout<<mm["b"];
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么不这样做.

Pot*_*ter 25

map::operator[]有点奇怪.它这样做:

  1. 寻找钥匙.
  2. 如果找到,请将其退回.
  3. 如果没有,请插入它并默认构造其关联值.
  4. 然后返回对新值的引用.

第3步与constness 不相容.不是有两个不同的运作operator[]超载,语言强迫你使用map::findconst对象.

或者,人们可以争辩说,map::operator[] const如果论证不在地图中会怎么办?抛出异常?未定义的行为?(毕竟,这就是vector::operator[]索引超出范围的原因.)无论如何,只要给我们带来一点点不便,就可以避免问题.

my_map.find(key)my_map.end()如果key找不到则返回.


bk1*_*k1e 5

std::map::operator[]如果请求的元素不在地图中,则插入默认构造的元素.这就是它不是const成员函数的原因.您可以使用std::map::find,但一定要检查它返回的迭代器.


Dra*_*ter 2

我相信这是因为[]in map isn't const,因为如果您寻址到不存在的一对,它会创建具有默认值的新对。尝试

void pas(const map <string, float> &mm)
{
    cout<<mm.find("a")->second;
    cout<<mm.find("b")->second;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果找不到密钥,此类代码可能会崩溃。 (2认同)