127

次のコードは、マップ asconstoperator[]メソッドに渡すと修飾子が破棄されることを示しています。

#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
4

5 に答える 5

173

std::mapoperator []は として宣言されておらず、その動作が原因であるとは言えませんconst:

T& operator[] (const Key& key)

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

その結果、関数を宣言できずconst、マップのoperator[].

std::mapfind()関数を使用すると、マップを変更せずにキーを検索できます。

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

at()C++11 では、 forも使用できますstd::map。element が存在しない場合std::out_of_range、 とは対照的に、関数は例外をスローしoperator []ます。

于 2008-11-04T18:37:03.777 に答える
13

マップを変更できるようにするため ( に割り当てることができます) 、そのメソッドはそうではないためoperator[]、 のマップでは使用できません。代わりにメソッドを使用してみてください。constconst_map[key]find

于 2008-11-04T18:33:25.357 に答える
7

GCC ヘッダーの一部の新しいバージョン (私のマシンでは 4.1 および 4.2) には非標準メンバー関数 map::at() があり、これは const と宣言され、キーがマップにない場合は std::out_of_range をスローします。

const mapped_type& at(const key_type& __k) const

関数のコメントの参照から、これは標準ライブラリの新しいメンバー関数として提案されているようです。

于 2008-11-04T19:00:44.273 に答える
0

まず、_ で始まるシンボルは使用しないでください。これは、言語実装/コンパイラ ライターに予約されているためです。誰かのコンパイラで _map が構文エラーになるのは非常に簡単です。

アンダースコアを使用する場合は、先頭ではなく末尾に置きます。おそらく、Microsoft のコードがそれを行っているのを見たために、この間違いを犯したのでしょう。彼らは独自のコンパイラを作成しているため、それでうまくいく可能性があることを忘れないでください。そうはいっても、それは悪い考えです。

演算子 [] は参照を返すだけでなく、実際にマップ内にエントリを作成します。したがって、マッピングを取得するだけでなく、マッピングがない場合は作成しています。それはあなたが意図したものではありません。

于 2010-03-19T13:45:49.610 に答える