【问题标题】:Would really like to wrap my head around a 'const' issue with maps [duplicate]真的很想解决地图的“常量”问题[重复]
【发布时间】:2024-01-19 01:26:01
【问题描述】:

可能重复:
Why isn't the [] operator const for STL maps?

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

#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 告终,因为,你知道,羞耻之类的。

【问题讨论】:

  • 坦率地说,这个问题有太多不相关的废话。人们不想浪费时间阅读所有内容。他们只是想要这个问题。
  • 很抱歉,克里斯 .. 这个话题真的非常枯燥,我试图在这个周末晚上(太平洋标准时间)稍微放松一下。我对一些 TL;DR 的尝试(甚至是大写!)显然也失败了 - 道歉。
  • @hEADcRASH,我们仍然重视幽默,但当它真正有损于实际问题时,我们就不会这样做了。也许最值得注意的例外是评价最高的 C++ 问题*.com/questions/1642028/…。如果您环顾四周,您会看到 cmets 之所以获得高分是因为他们很有趣,而不是因为他们很有帮助。这就是适度使用它。
  • 是的,理解(并同意)- 这绝对是一个(也许是用户名更改是为了?)headdesk 时刻看到已经被问到的远远更短的帖子重复的问题链接。

标签: c++ dictionary operator-overloading constants


【解决方案1】:

如果您查看 map 的 operator[] 的声明,您会发现它不是 const 限定的,这就是它不能在 const std::map&lt;std::string, double&gt; 上调用的原因。它不是 const 的原因是因为如果映射中不存在键,它会创建它。您应该改用findat 来获取元素。

【讨论】:

  • 完美,谢谢——完全忘记了可以创建密钥(如果它不存在的话)。再次感谢。
【解决方案2】:

map&lt;&gt;::operator[] 在地图中创建不存在的元素,这就是为什么在 const 对象上不允许这样做。你应该使用find()

(一些正确链接的问题已经回答了这个问题:例如Why isn't the [] operator const for STL maps? - 我会投票关闭它作为重复)

【讨论】:

  • 是的,当然,Tony .. 我进行了搜索(诚实的引擎!)但没有看到 .. 或者错过了 - 我今天盯着程序员字体太久了。