【问题标题】:Keys / Values Functionality to Iterators in C++C++ 中迭代器的键/值功能
【发布时间】:2010-10-03 21:33:51
【问题描述】:

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

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

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

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

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

谢谢,

【问题讨论】:

    标签: c++ stl map iterator


    【解决方案1】:

    看看 Boost 的 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, " "));
    

    【讨论】:

    • hmm,我无法编译,get_value operator() 是否真的没有返回类型?
    • Stack Overflow 太酷了。 (我无法测试代码,我家里没有安装 Boost。)
    猜你喜欢
    • 2021-11-27
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多