2

可能重复:
为什么 STL 映射的 [] 运算符不是 const?

我把它归结为(我认为是)它最简单的形式:

#include <iostream>
#include <map>
#include <vector>

class NumberHolder
{   
public:
    NumberHolder( const std::string aKey, const double aNumber );
    void printSmallestMappedNumber( const unsigned int theIndex ) const;
private:
    std::vector< std::map< std::string, double> > theNamedNumberMapVector;
};

NumberHolder::NumberHolder( const std::string key, const double aNumber )
{
    std::map<std::string, double> aTempMap;
    aTempMap[key] = aNumber;
    theNamedNumberMapVector.push_back(aTempMap);
}

void NumberHolder::printSmallestMappedNumber( const unsigned int theIndex ) const
{
    std::map<std::string, double>& aSpecificMap = theNamedNumberMapVector[theIndex];
    std::cout << aSpecificMap["min"] << std::endl;
}

int main(int argc, char* argv[])
{
    NumberHolder aTaggedNumberHolder("min", 13);
    aTaggedNumberHolder.printSmallestMappedNumber( 0 );
    return 0;
}

我有一个充满地图的矢量,每张地图都充满了(字符串)“标记”数字。我试图尽可能严格地控制对所涉及变量的可见性/可变性的访问。

无论如何,编译器失败并出现此错误

将对类型 'std::map' 的引用绑定到类型为 'const std::map, double, std::less >, std::allocator, double> > >' 的值丢弃限定符

我的第一次(未成熟)尝试是制作地图 const ...,因为我没有修改地图,只是从中检索一个值:

const std::map<std::string, double>& aSpecificMap = theNamedNumberMapVector[theIndex];

然后向我展示了这个公认的更短但实际上更令人困惑的错误:

No viable overloaded operator[] for type 'const std::map<std::string, double>'

在以下行上:

 std::cout << aSpecificMap["min"] << std::endl;

然而,也许是因为我一直试图解开这个问题,我的解决方案似乎非常非常糟糕:

std::map<std::string, double>& aSpecificMap = const_cast<std::map<std::string, double>&>(theNamedNumberMapVector[theIndex]);

const_casting 去掉 [const derp] 限定符可以解决我的问题,但我真的很想清楚地了解到底发生了什么。我猜编译器对我对地图的访问感到不满(在我的第二次尝试中,上面),并认为我会使用和滥用我对地图内容的访问。我真的很想/需要能够向其他人解释这样的事情,以及尽量不滥用语言并最终以 The Daily WTF 告终,因为,你知道,羞耻之类的。

4

2 回答 2

5

如果您查看 map 的operator[]的声明,您会发现它const不合格,这就是为什么不能在 a 上调​​用它的原因const std::map<std::string, double>。它不是 const 的原因是因为如果映射中不存在键,它会创建它。您应该改为使用findorat来获取元素。

于 2012-05-28T02:55:01.370 回答
0

map<>::operator[]如果它们尚不存在,则在地图中创建元素,这就是为什么它不允许在const对象上。你应该使用find().

(一些正确链接的问题已经回答了这个问题:例如,为什么 STL 地图的 [] 运算符不是 const ? -我将投票关闭它作为重复项)

于 2012-05-28T02:53:37.483 回答