std::map 的 inserter 实现

来源:互联网 发布:商业比赛队伍名称知乎 编辑:程序博客网 时间:2024/05/22 00:41

本来 std::map 不是 back insertable sequence,但是论坛上有人希望对一个 map 进行 std::copy in, std::copy out,于是偶就随便写了这么的个东西。。

template  >class map_inserter {public:  typedef std::map<_Key, _Value, _Compare> map_type;  typedef typename map_type::value_type value_type;private:  map_type &m_;public:  map_inserter( map_type &_m )    : m_(_m)  {}public:  template   class map_inserter_helper {  public:    typedef map_inserter<_K, _V, _Cmp> mi_type;    typedef typename mi_type::map_type map_type;    typedef typename mi_type::value_type value_type;    map_inserter_helper( map_type &_m )      :m_(_m)    {}    const value_type & operator= ( const value_type & v ) {      m_[v.first] = v.second;      return v;    }  private:    map_type m_;  };  typedef map_inserter_helper<> mi_helper_type;  mi_helper_type operator* () {    return mi_helper_type( m_ );  }  map_inserter<_Key, _Value, _Compare> &operator++() {    return *this;  }  map_inserter<_Key, _Value, _Compare> &operator++(int) {    return *this;  }};template map_inserter<_K, _V, _Cmp> map_insert( std::map<_K, _V, _Cmp> &m ) {  return map_inserter<_K, _V, _Cmp>( m );}int main(){  vector< pair > v;  map m;  m[3] = string("Hello");  copy( m.begin(), m.end(), back_inserter(v) );  m.clear();  copy( v.begin(), v.end(), map_insert(m) );}
原创粉丝点击