C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 从映射到向量的unique_copy元素值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一张地图< 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 <<" ";
}

预期产量:
1 2 3 4 2@H_607_12@

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

@L_874_3@

没有办法直接执行此操作,因为map迭代器的值类型和向量迭代器不兼容.你真的需要某种变换,或迭代器适配器.

您可以使用boost::transform_iterator:@H_607_12@

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,你必须自己编写这样一个迭代器适配器:@H_607_12@

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); }

然后你可以像这样使用它:@H_607_12@

unique_copy(
  makeSecondIterator(mp.begin()),makeSecondIterator(mp.end()),BACk_inserter(veC)
);

当然,可以使适配器更通用(也可以首先使用),和/或更多封装(它不需要公开);它还需要对常量函数进行适当的处​​理.但上面应该足以让你有这个想法.@H_607_12@

大佬总结

以上是大佬教程为你收集整理的c – 从映射到向量的unique_copy元素值全部内容,希望文章能够帮你解决c – 从映射到向量的unique_copy元素值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。