operator[] on map<> は、デフォルトで構築された文字列が存在しない場合にエントリを作成するため、const のキャストは間違っています。マップが実際に不変ストレージにある場合、マップは失敗します。operator[] は代入を許可するために非 const 参照を返すため、これはそうであるに違いありません。(例: m[1] = 2)
比較を実装する簡単な無料関数:
template<typename CONT>
bool check_equal(const CONT& m, const typename CONT::key_type& k,
const typename CONT::mapped_type& v)
{
CONT::const_iterator i(m.find(k));
if (i == m.end()) return false;
return i->second == v;
}
シンタックス シュガーについて考え、何か思いついたら更新します。
...
即時のシンタックス シュガーには、map<>::find() を実行し、map<>::const_iterator をラップする特別なクラスを返す無料の関数が含まれており、operator==() と operator!=() をオーバーロードして許可しています。マッピングされたタイプとの比較。したがって、次のようなことができます:
if (nonmutating_get(m, "key") == "value") { ... }
私はそれが以下よりもはるかに優れているとは確信していません:
if (check_equal(m, "key", "value")) { ... }
そして、それは確かにはるかに複雑であり、何が起こっているのかはあまり明白ではありません.
イテレータをラップするオブジェクトの目的は、デフォルトで構築されたデータ オブジェクトを持たないようにすることです。気にしない場合は、「get」回答を使用してください。
将来の用途を見つけることを期待して、比較よりも取得が優先されるというコメントに応えて、次のコメントがあります。
つまり、「check_equal」という関数を呼び出すと、オブジェクトを作成せずに等値比較を行っていることが明確になります。
必要になったときにだけ機能を実装することをお勧めします。それ以前に何かをするのは、しばしば間違いです。
状況によっては、既定のコンストラクターに副作用がある場合があります。比較しているのなら、なぜ余分なことをするのですか?
SQL 引数: NULL は空の文字列と同等ではありません。コンテナにキーが存在しないことは、デフォルトで構築された値でコンテナに存在するキーと本当に同じですか?
そうは言っても、デフォルトで構築されたオブジェクトは、非 const コンテナーで map<>::operator[] を使用することと同等です。また、デフォルトで構築されたオブジェクトを返す get 関数が現在必要とされている場合もあります。私は過去にその要件を持っていたことを知っています。