Функциональность ключей / значений для итераторов в C++

Я знаю, что раньше эти вопросы возникали в разных обличьях, но это немного другое.

У меня есть класс, который содержит std:: map. Хотя я хочу использовать карту для других целей внутри класса, внешне я хочу предоставить адаптеру итератора только значения внутри карты (т. Е. Второй элемент в std::pair).

Например, в Python я мог бы сделать что-то вроде этого:

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

Как мне сделать это в C++, скрывая реализацию внутри класса?

Спасибо,

Дэн

1 ответ

Решение

Посмотрите на Boost's 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, " "));
Другие вопросы по тегам