[英]std::map initialization with a std::vector
我想用std::vector
對象中包含的鍵初始化一個std::map
對象。
std::vector<char> mykeys { 'a', 'b', 'c' ];
std::map<char, int> myMap;
如果沒有循環,我怎么能這樣做?
我可以在我的int
添加默認值嗎?
沒有顯式循環:
std::transform( std::begin(mykeys), std::end(mykeys),
std::inserter(myMap, myMap.end()),
[] (char c) {return std::make_pair(c, 0);} );
演示 。
基於范圍的for循環會更加性感,所以盡可能使用它:
for (auto c : mykeys)
myMap.emplace(c, 0);
不 ,沒有循環或等效構造,你不能這樣做。 (句號)您可以在某些函數中隱藏循環,例如std::transform()
,但不能避免它。 此外,編譯器訓練有素,可以優化循環(因為它們無處不在),所以沒有充分的理由可以避免它們。
使用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
。
很傻。
沒有循環就不能這樣做。 你可以做的是隱藏標准算法下的循環,因為你需要將char
類型的對象轉換為std::map<char, int>::value_type
類型的對象,它代表自己std::pair<const char, int>
例如
#include <iostream>
#include <vector>
#include <map>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<char> v { 'a', 'b', 'c' };
std::map<char, int> m;
std::transform( v.begin(), v.end(), std::inserter( m, m.begin() ),
[]( char c ){ return std::pair<const char, int>( c, 0 ); } );
for ( const auto &p : m )
{
std::cout << p.first << '\t' << p.second << std::endl;
}
return 0;
}
輸出是
a 0
b 0
c 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.