質問

私は前に、様々な装いに来ているこの質問を知っているが、これは少し異なります。

私はのstd ::マップが含まれているクラスを持っています。私はクラス内で他の目的のためにマップを使用したいが、外部Iは、マップ内の値だけにイテレータアダプタ(STD ::ペアで、すなわち2番目の項目)を公開したい。

のpythonの例では、私はこのような何かを行う可能性があります。

def __iter__(self):
    return self._dict.itervalues()

私はクラス内の実装を隠して、C ++でこれをやって行く方法を教えてください。

おかげで、

ダン

役に立ちましたか?

解決

ブーストの transform_iterator 機能のまさにこのようなものを提供します:

template <typename K, typename V>
struct get_value {
    const V& operator ()(std::pair<K, V> const& p) { return p.second; }
};

class your_class {
    typedef map<int, float> TMap;
    TMap mymap;

public:
    typedef get_value<TMap::key_type, TMap::data_type> F;
    typedef
        boost::transform_iterator<F, TMap::iterator>
        value_iterator;

    value_iterator begin() { return make_transform_iterator(mymap.begin(), F()); }

    value_iterator end() { return make_transform_iterator(mymap.end(), F()); }

    // TODO Same for const versions.
    // Rest of the interface …
};

これは、例えば、値を反復処理することができますこのような:

your_class c;
// Fill c with some values …
copy(c.begin(), c.end(), ostream_iterator<float>(cout, " "));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top