1. ホーム
  2. c++

[解決済み] C++のマップアクセスは修飾子を削除する (const)

2022-07-29 07:05:51

質問

以下のコードでは、マップを const の中に operator[] メソッドは修飾語を破棄します。

#include <iostream>
#include <map>
#include <string>

using namespace std;

class MapWrapper {
public:
    const int &get_value(const int &key) const {
        return _map[key];
    }

private:
    map<int, int> _map;
};

int main() {
    MapWrapper mw;
    cout << mw.get_value(42) << endl;
    return 0;
}

マップアクセス時にアロケーションが発生する可能性があるためでしょうか?マップアクセスを行う関数はconstで宣言してはいけないのでしょうか?

MapWrapper.cpp:10: error: passing const std::map<int, int, std::less<int>,
std::allocator<std::pair<const int, int> > > as this argument of 
_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) 
[with _Key = int, _Tp = int, _Compare = std::less<int>, 
_Alloc = std::allocator<std::pair<const int, int> >] discards qualifiers

どのように解決するのですか?

std::map 's operator [] として宣言されていない const として宣言されておらず、その動作のためにそうすることができません。

T& operator[] (const Key& キー)

keyと等価なキーにマッピングされた値への参照を返し、そのようなキーがまだ存在しない場合は挿入を実行します。

その結果、あなたの関数は const と宣言し、マップの operator[] .

std::map 's find() 関数によって、マップを修正することなくキーを調べることができます。

find() iterator または const_iterator std::pair の両方を含む、キー ( .first ) と値 ( .second ).

C++11では、さらに at() に対して std::map . 要素が存在しない場合、この関数は std::out_of_range とは対照的に、例外 operator [] .