7

我知道这个问题以前曾以各种形式出现过,但这略有不同。

我有一个包含 std::map 的类。尽管我希望在类内将映射用于其他目的,但在外部我想将迭代器适配器公开给映射内的值(即 std::pair 中的第二项)。

例如在python中我可能会做这样的事情:

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

我如何在 C++ 中执行此操作,将实现隐藏在类中?

谢谢,

4

1 回答 1

16

看看 Boosttransform_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, " "));
于 2009-01-27T22:58:38.653 回答