使用vector <supersetoft>中的元素初始化vector <t>(映射函数?)

时间:2016-10-12 00:45:35

标签: c++ c++11

class SomeType { int32_t variable; }

std::vector<SomeType> myVector(10);

// ... code to work with myVector

std::vector<int32_t> myOtherVector;
for(int i = 0; i < myVector.size(); i++)
{
    myOtherVector.push_back(myVector[i].variable);
}

有更好的方法吗?我已经看过如何使用lambda进行复杂的初始化,但是我无法弄清楚如何将这个新的向量中的Type的某些字段“映射”(用C#术语)。

2 个答案:

答案 0 :(得分:4)

它不会初始化,但您可以使用std::transform

myOtherVector.resize(myVector.size());
std::transform(myVector.cbegin(), myVector.cend(), myOtherVector.begin(), 
               [](auto const& s){
    return s.variable;
});

back_inserter

myOtherVector.reserve(myVector.size()); // optional
std::transform(myVector.cbegin(), myVector.cend(), std::back_inserter(myOtherVector),
               [](auto const& s){
    return s.variable;
});

您可以使用Boost的transform_iterator 初始化

auto tr = [](auto const& s){
    return s.variable;
});

vector<int32_t> myOtherVector(
    boost::make_transform_iterator(myVector.begin(), tr),
    boost::make_transform_iterator(myVector.end(), tr)
);

答案 1 :(得分:0)

我好一点(恕我直言)

for ( auto const &  elem : myVector )
{
    myOtherVector.emplace_back(elem.variable);
}