提问者:小点点

将VectorPair>>复制到VectorString>


我用gcc9.2.0和boost 1.55。

我有两个向量:

vector< pair< string, int > > source;
vector< string > dest;

我需要将源向量转换到目标,那应该只包含源向量的字符串元素。

可以使用boost::push_back和适配器访问它吗?

boost::range::push_back( dest, source | ?adaptor? );

目前我有这个可工作的代码,但是应该更改它:

transform( source.begin(), source.end(), back_inserter(dest), __gnu_cxx::select1st< std::pair< std::string, int > >() );

共2个答案

匿名用户

您可以将与lambda一起使用:

#include <algorithm> // transform
#include <iterator>  // back_inserter

std::transform(source.begin(), source.end(), std::back_inserter(dest),
               [](auto& p) {
                   return p.first;
               });

匿名用户

下面是一个使用适配器的增强解决方案:

#include <boost/range/adaptor/transformed.hpp>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

using boost::adaptors::transformed;

// define function object (so we can pass it around) emulating std::get
template<std::size_t N>
auto constexpr get = [](auto const& x){ return std::get<N>(x); };

int main()
{
    // prepare sample input
    std::vector<std::pair<std::string,int>> source{{"one",1},{"two",2},{"three",3}};

    // the line you look for
    auto dest = source | transformed(get<0>);

    // show the result
    for (auto const& i : dest) {
        std::cout << i << '\n';
    }
}