unique_copy元素值从map到vector

 手机用户2502937447 发布于 2023-02-13 01:00

我有一个map,我想unique_copy用来将值放入vector.我试过这个,但它不起作用:

#include 
#include 
#include 
#include 
#include 
using namespace std;
using namespace placeholders;


int main() {
    map mp;

    mp["1"] = 1;
    mp["2"] = 2;
    mp["3"] = 3;
    mp["4"] = 3;
    mp["5"] = 3;
    mp["6"] = 4;
    mp["7"] = 2;

    vector vec;

    unique_copy( mp.begin(), mp.end(),
                 back_inserter(vec),
                 bind(&map::value_type::second, _1) );


    for( auto& i : vec )
        cout<< i <<" ";
}

预期产量:1 2 3 4 2

所有谷歌搜索都返回使用方式,transform但我需要unique_copy.有没有办法让这项工作?

1 个回答
  • 没有办法直接执行此操作,因为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不需要公开); 它还需要对常量函数进行适当的处​​理.但上面应该足以让你有这个想法.

    2023-02-13 01:27 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有