使用boost库:
template<class Iterators, class Transform>
boost::iterator_range< boost::transform_iterator<
typename std::decay_t<Transform>::type,
Iterator
>> make_transform_range( Iterator begin, Iterator end, Transform&& t ) {
return {
boost::make_transform_iterator( begin, t ),
boost::make_transform_iterator( end, t )
};
}
一个将键映射到对的帮助程序:
template<class T>
struct key_to_element_t {
T val;
template<class K>
std::pair< typename std::decay<K>::type, T > operator()(K&& k) const {
return std::make_pair( std::forward<K>(k), val );
}
};
template<class T>
key_to_element_t< typename std::decay<T>::type > key_to_element( T&& t ) {
return { std::forward<T>(t) };
}
template<class R>
struct range_to_container_t {
R r;
template<class C>
operator C()&& {
using std::begin; using std::end;
return { begin(std::forward<R>(r)), end(std::forward<R>(r)) };
}
};
template<class R>
range_to_container_t<R> range_to_container( R&& r ) { return std::forward<R>(r); }
在所有这些混乱之后,我们得到了:
std::vector<char> mykeys { 'a', 'b', 'c' ];
std::map<char, int> myMap = range_to_container( make_transform_range( begin(mykeys), end(mykeys), key_to_element( 0 ) ) );
该函数直接从mykeys
向量中转换序列的元素来构建std::map
,有点愚蠢。
相当荒谬。