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

时间:2010-05-02 05:37:04

标签: c++ map const

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

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

}

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

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

我想知道为什么没有。

3 个答案:

答案 0 :(得分:25)

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

  1. 找钥匙。
  2. 如果找到,请将其退回。
  3. 如果没有,插入并默认构建其关联值。
  4. 然后返回对新值的引用。
  5. 第3步与const不兼容。该语言不是让两个功能不同的operator[]重载,而是强迫您对map::find个对象使用const

    或者,有人可能会说,如果参数不在地图中,map::operator[] const会做什么?抛出异常?未定义的行为? (毕竟,这就是vector::operator[]对索引超出界限所做的事情。)无论如何,只要给我们带来一点点不便就可以避免这个问题。

    如果找不到my_map.find(key),则

    my_map.end()会返回key

答案 1 :(得分:5)

如果请求的元素不在地图中,

std::map::operator[]会插入默认构造的元素。这是why it is not a const member function。您可以使用std::map::find代替,但请务必检查它返回的迭代器。

答案 2 :(得分:2)

我认为这是因为地图中的[]不是const,因为它创建了具有默认值的新对,如果你解决了不存在的问题。试试

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