簡體   English   中英

C ++如何僅將map迭代器公開給map的值

[英]C++ How to expose a map iterator to only the values of a map

我有一些模板可以有一個地圖或一個矢量作為底層容器。 我希望模板能夠將const迭代器暴露給元素。 我讀過的關於如何公開迭代器的大部分信息(例如這篇文章 )都使用了一種形式

typedef std::vector<int>::iterator iterator;
typedef std::vector<int>::const_iterator const_iterator;
iterator begin() { return values.begin(); }
iterator end() { return values.end(); }

這對於使用地圖的模板並不真正有效,因為要訪問元素,模板不能再使用it->SomeMemberFunc() ,而是需要使用it->second.SomeMemberFunc() 所以我希望向map元素公開一個迭代器,它不能訪問keys ,只能訪問map的值。

我怎么做到這一點?

解決方法1

#include <map>
#include <iterator>

template <typename Iter>
struct map_iterator : public std::iterator<std::bidirectional_iterator_tag,
                      typename Iter::value_type::second_type> 
{
    map_iterator() {}
    map_iterator(Iter j) : i(j) {}
    map_iterator& operator++() { ++i; return *this; }
    map_iterator& operator--() { --i; return *this; }
    bool operator==(map_iterator j) const { return i == j.i; }
    bool operator!=(map_iterator j) const { return !(*this == j); }
    typename map_iterator::reference operator*() { return i->second; }
    typename map_iterator::pointer operator->() { return &i->second; }
    map_iterator operator--(int) { return std::prev(--(*this)); }
    map_iterator operator++(int) { return std::next((++*this)); }
protected:
    Iter i;
};

template <typename Iter>
inline map_iterator<Iter> make_map_iterator(Iter j) {
    return map_iterator<Iter>(j);
}

然后

int main() {
    std::map<int,std::string> m {{1, "Hi"},{2, "Bye"}};

    for (auto i=make_map_iterator(m.begin()); i!=make_map_iterator(m.end());i++)
        cout << *i << endl;
}

實時代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM