[解決済み] 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 []
.
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] Static readonly」対「const」。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない