1. ホーム
  2. c++

[解決済み】mapがキーに値を含むかどうかを判断する?

2022-03-30 17:44:25

質問

STLマップが与えられたキーに対応する値を含んでいるかどうかを判断する最良の方法は何ですか?

#include <map>

using namespace std;

struct Bar
{
    int i;
};

int main()
{
    map<int, Bar> m;
    Bar b = {0};
    Bar b1 = {1};

    m[0] = b;
    m[1] = b1;

    //Bar b2 = m[2];
    map<int, Bar>::iterator iter = m.find(2);
    Bar b3 = iter->second;

}

これをデバッガで調べると、次のようになります。 iter は単なるゴミデータです。

この行をコメントアウト解除すると

Bar b2 = m[2]

デバッガでは b2{i = 0} . (未定義のインデックスを使うと、すべて空/未初期化の値を持つ構造体が返されるということでしょうか)

どちらの方法も、それほど素晴らしいものではありません。私が本当に欲しいのは、こういうインターフェースです。

bool getValue(int key, Bar& out)
{
    if (map contains value for key)
    {
        out = map[key];
        return true;
    }
    return false;
}

このような内容のものは存在するのでしょうか?

解決方法は?

<ブロッククオート

このようなものは存在するのでしょうか?

いいえ、stl マップ・クラスで、あなたは ::find() を使用してマップを検索し、返されたイテレータを std::map::end()

だから

map<int,Bar>::iterator it = m.find('2');
Bar b3;
if(it != m.end())
{
   //element found;
   b3 = it->second;
}

もちろん、自分で getValue() ルーチンを使用する理由はありません。 out を使うコツをつかんだら、このような使い方をするのではないでしょうか? std::map::find() を使えば、時間を無駄にすることはないでしょう。

また、あなたのコードは少し間違っています。

m.find('2'); であるキーバリューをマップから探します。 '2' . C++コンパイラは暗黙のうちに'2'をint型に変換してしまうので、結果として'2'のASCIIコードの数値になってしまい、望んだものではありません。

この例のキータイプは int のように検索したい。 m.find(2);