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

前端之家收集整理的这篇文章主要介绍了c – 如何根据`std :: set`中的元素切割`std :: vector`前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有一种很好的方法来根据std :: set中的元素切片std :: vector?换句话说,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"));
}

哪个正确返回

1.2
4.5
5.6

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

解决方法

你可以通过简单地使用std :: transform来实现这个目的:
int main()
{
  std::vector<double> x { 1.2,5.6};
  std::set<unsigned int> I { 0,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(),std::ostream_iterator <double>(std::cout,"\n"));  
}

猜你在找的C&C++相关文章