gpt4 book ai didi

c++ - unique_copy 元素值从映射到 vector

转载 作者:太空狗 更新时间:2023-10-29 20:13:36 25 4
gpt4 key购买 nike

我有一个 map<K, V>我想使用 unique_copy将值放入 vector<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

所有谷歌搜索返回使用transform的方式但我需要unique_copy .有什么方法可以使它起作用吗?

最佳答案

没有办法直接这样做,因为映射迭代器和 vector 迭代器的值类型不兼容。您确实需要某种转换或迭代器适配器。

你可以使用 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 不必公开);它还需要对 const-iterators 进行适当的处​​理。但以上内容应该足以让您了解。

关于c++ - unique_copy 元素值从映射到 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20370443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com