c – 从映射到向量的unique_copy元素值
发布时间:2020-12-16 09:49:15 所属栏目:百科 来源:网络整理
导读:我有一张地图 K,V我想使用unique_copy将值放入向量 V中. 我试过这个,但它不起作用: #include iostream#include map#include algorithm#include vector#include functionalusing namespace std;using namespace placeholders;int main() { mapstd::string,in
我有一张地图< K,V>我想使用unique_copy将值放入向量< V>中.
我试过这个,但它不起作用: #include <iostream> #include <map> #include <algorithm> #include <vector> #include <functional> using namespace std; using namespace placeholders; int main() { map<std::string,int> mp; mp["1"] = 1; mp["2"] = 2; mp["3"] = 3; mp["4"] = 3; mp["5"] = 3; mp["6"] = 4; mp["7"] = 2; vector<int> vec; unique_copy( mp.begin(),mp.end(),back_inserter(vec),bind(&map<std::string,int>::value_type::second,_1) ); for( auto& i : vec ) cout<< i <<" "; } 预期产量: 所有谷歌搜索都返回使用转换的方法,但我需要unique_copy.有没有办法让这项工作? 解决方法
没有办法直接执行此操作,因为map迭代器的值类型和向量迭代器不兼容.你真的需要某种变换,或迭代器适配器.
您可以使用 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(),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) ); 当然,可以使适配器更通用(也可以首先使用),和/或更多封装(它不需要公开);它还需要对常量函数进行适当的处??理.但上面应该足以让你有这个想法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |