7

この質問が以前にもさまざまな形で出てきたことは知っていますが、これは少し異なります。

std::map を含むクラスがあります。クラス内の他の目的でマップを使用したいのですが、外部的にはイテレータ アダプタをマップ内の値 (つまり、std::pair の 2 番目の項目) だけに公開したいと考えています。

たとえば、Python では次のようにします。

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

クラス内に実装を隠して、C ++でこれを行うにはどうすればよいですか?

ありがとう、

ダン

4

1 に答える 1

16

Have a look at Boost's transform_iterator which provides exactly this kind of functionality:

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 …
};

Now you can iterate over the values, e.g. like this:

your_class c;
// Fill c with some values …
copy(c.begin(), c.end(), ostream_iterator<float>(cout, " "));
于 2009-01-27T22:58:38.653 に答える