4

マップからベクトルを埋めようとしています。私はこれをより従来の方法で行う方法を知っていますが、ある種のトレーニングとしてSTLアルゴリズム(ワンライナー)でそれを達成しようとしていました:)。

元のマップ タイプは次のとおりです。

std::map< std::string, boost::shared_ptr< Element > >

宛先ベクトルは次のとおりです。

std::vector< Element > theVector;

私がこれまでに持っているのはこれです:

std::transform( theMap.begin(), theMap.end(),
        std::back_inserter( theVector ),
        boost::bind( &map_type::value_type::second_type::get, _1 )
        );

しかし、これは機能しないベクトルにポインターを挿入しようとしています。私もこれを試しました:

using namespace boost::lambda;
using boost::lambda::_1;

std::transform( theMap.begin(), theMap.end(),
        std::back_inserter( theVector ),
        boost::bind( &map_type::value_type::second_type::get, *_1 )
        );

しかし、それも機能していません。

編集:

私はこの実用的な解決策を持っていますが、あまり印象的ではありません:)

std::for_each( theMap.begin(), theMap.end(), 
        [&](map_type::value_type& pair)
        {
            theVector.push_back( *pair.second );
        } );

Edit2: ここで私があまり慣れていないのは bind() です。したがって、bind() ソリューションは大歓迎です!

4

2 に答える 2

2

どうですか:

// Using std::shared_ptr and lambdas as the solution
// you posted used C++11 lambdas.
//
std::map<std::string, std::shared_ptr<Element>> m
    {
        { "hello", std::make_shared<Element>() },
        { "world", std::make_shared<Element>() }
    };
std::vector<Element> v;

std::transform(m.begin(),
               m.end(),
               std::back_inserter(v),
               [](decltype(*m.begin())& p) { return *p.second; });

http://ideone.com/ao1C50でオンライン デモを参照してください。

于 2013-01-31T16:58:25.030 に答える
1

別の代替手段として、次の新しいfor構文があります。

for(auto &cur_pair: the_map) { theVector.push_back(*(cur_pair.second)); }

それは少なくともワンライナー(一種)ですstd::for_eachが、よりコンパクトにするための別の方法です。

于 2013-01-31T17:15:08.940 に答える