如何根据`std :: set`中的元素切割`std :: vector`

wye*_*r33 7 c++

有没有一种很好的方法来切割std::vector基于元素的std::set?换句话说,std::set在向量中保存我想要的索引中的元素.当然,我可以用代码完成这个:

#include <set>
#include <vector>
#include <iostream>
#include <iterator>

template <typename T>
std::vector <T> slice(
    std::vector <T> const & x,
    std::set <unsigned int> const & I
) {
    auto y = std::vector <T> ();
    for(auto const & i : I)
        y.push_back(x[i]);
    return y;
}

int main() {
    auto x = std::vector <double> { 1.2, 2.3, 3.4, 4.5, 5.6};
    auto I = std::set <unsigned int> { 0, 3, 4};
    auto y = slice(x,I);
    std::copy(y.begin(),y.end(),std::ostream_iterator <double>(
        std::cout,"\n"));
}
Run Code Online (Sandbox Code Playgroud)

哪个正确返回

1.2
4.5
5.6
Run Code Online (Sandbox Code Playgroud)

然而,这感觉有点笨拙.有没有更好的办法?

mcs*_*rep 5

您只需使用std::transform以下命令就可以实现:

int main()
{
  std::vector<double> x { 1.2, 2.3, 3.4, 4.5, 5.6};
  std::set<unsigned int> I { 0, 3, 4};
  std::vector<double> y(I.size());

  std::transform(I.begin(), I.end(), y.begin(),
    [&x](unsigned int i) { return x[i]; });

  std::copy(y.begin(),y.end(),std::ostream_iterator <double>(std::cout,"\n"));  
}
Run Code Online (Sandbox Code Playgroud)