1

パフォーマンスが重要でないコードで多くのマップにアクセスしています。欠落しているキーをチェックするために、通常の find/!=end を常に記述したくありません。また、盲目的に [] を使用してデフォルト値を取得したくありません。次のラッパー関数は賢いですか、それとも愚かですか? もっと簡単な方法はありますか?私が考慮しなかった副作用はありますか?

template<typename M>
static typename M::mapped_type getMapValue(const M& m, typename M::key_type key) {

    typename M::const_iterator it = m.find(key);

    if (it != m.end()) {
        return it->second;
    } else {
        std::cerr << "Key: " << key << " not found!" << std::endl;
        std::cerr << "Returning default value." << std::endl;
        return typename M::mapped_type();
    }

}
4

5 に答える 5

2

を使用することをお勧めします。その後、クライアント コードは、マップにまだ存在しないキーを使用して呼び出しからスローされた例外std::map::atを処理する方法を決定する必要があります。std::out_of_range

std::map<std::string, int> m;

....
int n = m.at("hello!");
于 2013-02-17T09:02:24.277 に答える
1

頭いい

コンテナをラップするstdことは、将来、必要に応じてコンテナを交換できるため、通常は良い考えです。

ただし、デフォルト値を返すことは正しい動作ですか?それはあなたの場合かもしれませんが、ほとんどの場合、そうではありません。

于 2013-02-17T08:59:46.503 に答える
1

アイデアがチェックされている場合は、おそらく次のようなものが必要です。

if (theMap.count(theKey)) {
  doSomethingWith(theMap[theKey]);
} else {
  doSomethingDefault();
}

名前の数は、要素が存在する場合はtrueを返し、存在しない場合はfalseを返すため、非常に扱いにくいものです。キーごとに複数の値をサポートするコンテナと一貫性があるはずだったと思いますが、そのコンテナを作成することはありませんでした。「count」「contains」の名前を変更するためだけにマップをラップする価値はおそらくありません。

于 2013-02-18T18:48:39.797 に答える
1

プログラム ロジックの一部で STL インターフェイスが扱いにくくなると、単一の関数へのアクセスだけでなく、コンテナー全体をラップする傾向があります。通常、その後、既存のコンテナー タイプから非公開で派生させ、必要な部分を再度公開します。さらに、const マップのようなオブジェクトの operator[] など、必要な実際のインターフェイスを追加します。

struct mycontainer:
    private map<string, string>
{
    typedef map<string, string> base;
    using base::iterator;
    using base::const_iterator;
    using base::begin;
    using base::end;

    string const& operator[](string const& k) const
    {
        const_iterator it = find(k);
        if(it == end())
            throw runtime_error("lookup failure");
        return it->second;
    }
};

ノート:

  • 特別なイテレータが必要な場合は、Boost にヘルパー ライブラリがあり、カスタム イテレータ タイプを簡単に作成できます。
  • インターフェイスを大幅に変更することもできます。たとえば、マップに追加せずにデフォルト値を返したり、boost::optional を返したりします。後者は存在を簡単に確認し、1 つのステップで値を取得する方法です。
于 2013-02-17T09:50:02.917 に答える
0

要素が見つからない場合は、例外をスローする方がよいと思います。とにかく、プログラムが出力するこれらすべての警告について、誰があなたのプログラムを監視するのでしょうか?

また、const-referenceでキーを取得することを検討std::mapしてください。

于 2013-02-17T08:59:53.053 に答える