c++ - 如何从 const ref 获取键的值?

标签 c++ c++11 unordered-map

为什么我无法在传递给函数的 const ref unordered_map 中获取键的值,但我可以获取本地 unordered_map 的值?

GameObject(const std::unordered_map<int,std::unordered_map<int,int>>& objectParameters){
        if (objectParameters.find(CAPABILITY_TYPE_SPECIE)!=objectParameters.end()) {

 //Following line gives an error:
    auto map2 = objectParameters[CAPABILITY_TYPE_SPECIE];         

//Following line works just fine
            std::unordered_map<int,std::unordered_map<int,int>> objectParameters2;
            auto map = objectParameters2[CAPABILITY_TYPE_SPECIE];

        }

为什么我不能从 objectParameters 中获取值? 编译器报错是:

No viable overloaded operator[] for type 'const std::unordered_map >'

编辑:从类型中删除“const”似乎可以使错误消失。这是为什么 ?

最佳答案

operator[] 是一个非常量成员函数,不能通过 const 引用在您拥有的对象上调用。它不能是 const 成员,因为如果键不在 map 中,它会被指定插入一个项目。碰巧你甚至不需要使用它。

您使用 find() 然后丢弃结果,为什么?如果该项目存在,它会获取该项目的迭代器。所以不要丢弃它,使用它。

auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
     auto map2 = item->second;

尽管如果您希望 map2map1 中已有的相同,上面的方法也不会这样做。因为 auto map2item->second 的拷贝。要修改 map1 中的项目,我们需要使 map2 成为引用:

auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
     auto& map2 = item->second;

关于您的编辑,删除 const 以“修复”此类错误是错误的做法。 Const 的正确性很重要,当您进行这样的“修复”时,它可能会在您的代码中引入细微的错误。因为现在不应该改变的事情可能会意外地开始改变。

关于c++ - 如何从 const ref 获取键的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50148543/

相关文章:

c# - 应用程序仅在带有 visual studio 的 pc 上运行

c++ - 在C++中确定模板参数的类型

C++:将自定义哈希键值从 unordered_map 输出到 std::cout 时出错

c++ - 为什么在现阶段,大多数现代 C++ 编译器只支持有限的 C++0x 功能,而 Clang/GCC 支持所有这些功能?

c++ - 如何用固定元素直接初始化unordered_map?

c++ - 什么时候使用 std::unordered_map::emplace_hint?

c++ - 变量初始化和构造函数

c++ - const char * 作为动态数组的参数

c++ - 使用 c++11 的 <random> header ,获取 0 到 n 之间的整数的正确方法是什么?

c++ - 标准是否要求流构造函数不访问流缓冲区?