Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > std::transform vector to map


Автор: Vaulter 22.8.2012, 19:05
Код

typedef std::vector<unsigned int> vint;
typedef std::map<unsigned int, unsigned int> mint;

    vint group;
    mint mapi;

    std::transform( group.begin(), group.end(), std::inserter( mapi, mapi.begin() ),
        std::bind2nd( std::ptr_fun( &std::make_pair< mint::key_type, mint::value_type > ), (mint::value_type)0 )
    );



Цитата

interface.cpp: In member function 'void voice_module::check_gr(r::Request&)':
interface.cpp:156: error: no matching function for call to 'std::pair<const unsigned int, unsigned int>::pair(int)'
/usr/include/c++/4.2/bits/stl_pair.h:84: note: candidates are: std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = const unsigned int, _T2 = unsigned int]
/usr/include/c++/4.2/bits/stl_pair.h:80: note:                 std::pair<_T1, _T2>::pair() [with _T1 = const unsigned int, _T2 = unsigned int]
/usr/include/c++/4.2/bits/stl_pair.h:69: note:                 std::pair<const unsigned int, unsigned int>::pair(const std::pair<const unsigned int, unsigned int>&)
*** Error code 1



направьте на путь истинный! 

Автор: borisbn 23.8.2012, 10:46
1. Замени mint::value_type на mint::mapped_type.  value_type - это пара, а тебе (насколько я понял) нужно именно значение (второй тип)
2. У меня выдавало гору непонятных ошибок, пока я не поставил
#undef __GXX_EXPERIMENTAL_CXX0X__ 
перед всеми инклюдами

Добавлено @ 10:52
http://liveworkspace.org/code/ad2ee2574d43b496223b051a06a43cb8

P.S. Я тоже часто пытаюсь сделать всё через стандартные алгоритмы, а потом переписываю на простой for, сравниваю и вижу, что с for'ом гораздо понятней и читаемее. сравни свою конструкцию
Код
std::transform( group.begin(), group.end(), std::inserter( mapi, mapi.begin() ),
        std::bind2nd( std::ptr_fun( &std::make_pair< mint::key_type, mint::value_type > ), (mint::value_type)0 )
    );

и эту
Код
    for ( const auto & it : group ) {
       mapi.insert( std::make_pair( it, 0 ) );
    }

 smile 

без С++11 будет чуть-чуть более громоздко
Код
for ( vint::const_iterator it = group.begin(), e = group.end(); it != e; ++it  ) {
       mapi.insert( std::make_pair( *it, 0 ) );
    }

Автор: Vaulter 27.8.2012, 16:48
по понятность написания - полностью согласен,
но, чисто гипотетически, transform может быть оптимизирован и быть быстрее цикла

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)