読者です 読者をやめる 読者になる 読者になる

続・mapの検索と値取得

C++

mapの検索と値取得の続き


Steven Watanabeさんが「ポインタでいいじゃん」と言ってて、
ポインタを直接使うのがイヤだったので、ポインタをラップしたptr_optionalを用意しました。
ユーザーコードは、昨日のとほとんど変わりません。(optionalがptr_optionalになっただけ)

#include <iostream>
#include <map>
#include <string>

template <class T>
class ptr_optional {
    const T* p_;
public:
    ptr_optional() : p_(0) {}
    ptr_optional(const T* p) : p_(p) {}

    const T& get() const { return *p_; }

    operator bool() const { return p_ != 0; }
    bool operator!() const { return !p_; }
};

template <class Map, class Key>
ptr_optional<typename Map::mapped_type>
    map_find(const Map& m, const Key& key)
{
    typedef ptr_optional<typename Map::mapped_type> result_type;
    typename Map::const_iterator it = m.find(key);
    return it != m.end() ? result_type(&it->second) : result_type();
}

int main()
{
    std::map<std::string, int> m;

    m["Akira"]  = 24;
    m["Millia"] = 16;
    m["Johnny"] = 38;

    if (ptr_optional<int> value = map_find(m, "Akira"))
        std::cout << value.get() << std::endl;
    else
        std::cout << "Not Found" << std::endl;
}


追記:
optionalで書き直しました。

#include <iostream>
#include <map>
#include <string>
#include <boost/optional.hpp>

template <class Map, class Key>
boost::optional<typename Map::mapped_type const&>
    map_find(const Map& m, const Key& key)
{
    typedef boost::optional<typename Map::mapped_type const&> result_type;
    typename Map::const_iterator it = m.find(key);
    return it != m.end() ? result_type(it->second) : result_type();
}

int main()
{
    std::map<std::string, int> m;

    m["Akira"]  = 24;
    m["Millia"] = 16;
    m["Johnny"] = 38;

    if (boost::optional<const int&> value = map_find(m, "Akira"))
        std::cout << value.get() << std::endl;
    else
        std::cout << "Not Found" << std::endl;
}