reading object from const unordered_map

后端 未结 2 1263
南笙
南笙 2021-01-07 17:21

Why am I not allowed to read an object from a constant unordered_map?

const unordered_map z;
int val = z[5]; // compile error
相关标签:
2条回答
  • 2021-01-07 17:51

    The expression z[5] calls a non-const member function of the map.

    This is because a map's operator[] will insert a new element if the key isn't found, so obviously it has to be non-const.

    For a vector nothing is inserted by operator[], the element must exist already (or you get undefined behaviour, so the equivalent code would access the 6th element of an empty vector, which is not fine!).

    To lookup a key without adding it use:

    int val = 0;
    auto it = z.find(5);
    if (it != z.end())
      val = it->second;
    
    0 讨论(0)
  • 2021-01-07 18:08

    As Jonathan already said, the operator[] method is non-const because it might add a default value when the item being looked up is not found.

    On the other hand, as highlighted from Benjamin in a comment, the at() method is available for const as well.

    const unordered_map<int, int> z;
    int val = z.at(5); // Success!
    

    The downside is that when the value being looked up is not in the map, a std::out_of_range exception is raised, so it has to be managed.

    0 讨论(0)
提交回复
热议问题