我有一个map
,我想unique_copy
用来将值放入vector
.我试过这个,但它不起作用:
#include#include
预期产量:1 2 3 4 2
所有谷歌搜索都返回使用方式,transform
但我需要unique_copy
.有没有办法让这项工作?
没有办法直接执行此操作,因为map迭代器的值类型和向量迭代器不兼容.你真的需要某种变换,或迭代器适配器.
你可以使用boost::transform_iterator
这个:
auto getValue = [](const std::map<std::string, int>::value_type &pair) { return pair.second; }; unique_copy( boost::make_transform_iterator(mp.begin(), getValue), boost::make_transform_iterator(mp.end(), getValue), back_inserter(vec) );
如果你不能使用Boost,你必须自己编写这样一个迭代器适配器:
template <class T_PairIterator> struct SecondIterator { typedef T_PairIterator PairIterator; typedef typename std::iterator_traits<PairIterator>::iterator_category iterator_category; typedef typename std::iterator_traits<PairIterator>::value_type::second_type value_type; typedef typename std::iterator_traits<PairIterator>::difference_type difference_type; typedef value_type *pointer; typedef value_type &reference; PairIterator it; SecondIterator() {} explicit SecondIterator(PairIterator it) : it(it) {} pointer operator-> () const { return &it->second; } reference operator* () const { return it->second; } SecondIterator& operator++ () { ++it; return *this; } SecondIterator operator++ (int) { SecondIterator ret(*this); ++it; return ret; } }; template <class T> bool operator== (const SecondIterator<T> &lhs, const SecondIterator<T> &rhs) { return lhs.it == rhs.it; } template <class T> bool operator!= (const SecondIterator<T> &lhs, const SecondIterator<T> &rhs) { return !(lhs == rhs); } template <class T> SecondIterator<T> makeSecondIterator(const T &it) { return SecondIterator<T>(it); }
然后你可以像这样使用它:
unique_copy( makeSecondIterator(mp.begin()), makeSecondIterator(mp.end()), back_inserter(vec) );
当然,适配器可以更通用(也许也可以使用first
),和/或更多封装(it
不需要公开); 它还需要对常量函数进行适当的处理.但上面应该足以让你有这个想法.