地図があると言う
map<string, string> m;
そして、
string x = m["asdf"];
「asdf」がマップにあるかどうかはわかりません。そうすると、 を見て、それがマップにあったかどうかを確実に判断することができなくなりますx
。あれは正しいですか?
m.first(asdf)
だから私はこれを理解するために最初にやるべきだった。
Then I won't be able to reliably figure out if it was in the map or not by looking at x. Is that correct?
You are right. It'll be default constructed in case it's missing.
You should use m.count("asdf")
(just find out if it exists) or m.find("asdf")
(plus, get the reference if it exists) to find out whether it exists. Depending on your requirements.
map::operator[]
マップにキーがない場合は、デフォルト値でキーを挿入します。
あなたがそれを望まない場合:
std::map<string, string>::iterator it = m.find("asdf");
//if you use C++11:
//auto it = m.find("asdf");
if (it == m.end())
std::cout << "Not found" << std::endl;
else
std::cout << "The value is " << *it << std::endl;
はmap::operator[]
多くのことに役立ちますが、特に参照に関しては便利です。例えば:
std::string &x = m["asdf"];
x += "X";
これ"X"
により、マップ内の (おそらく新しく作成された) 文字列に が追加されます。
x は、構築されたデフォルトの std::string になります。operator[] がコンパイルされるとき、 std::map にはデフォルトのコンストラクターが必要です。
まず、operator[] は、デフォルト コンストラクターではなく値の初期化を使用して値のオブジェクトが見つからない場合、'value' オブジェクトを構築します。これは、必要に応じて既定のコンストラクターを使用し、組み込み型の場合 (int、float、ポインター) をゼロで初期化し、集約 (単純な構造体など) の再帰的な値の初期化を行うことを意味します。
operator[] から値で構築されたオブジェクトを取得した場合、それがマップ内にあったのか、それともその場で生成されたのかがわからないというのは正しいことです。operator[] のもう 1 つの問題は、const メンバーではないことです。
とはいえ、演算子が役立つ場合もあります。たとえば、マップを使用してテキストの単語数を保存すると、
unsigned countCats( std::map<std::string, unsigned> dict )
{
unsigned count = disc["cat"];
}
オペレーターは、期待どおりに機能します。