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

前端之家收集整理的这篇文章主要介绍了c – 如何根据`std :: set`中的元素切割`std :: vector`前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有一种很好的方法来根据std :: set中的元素切片std :: vector?换句话说,std :: set中的元素在向量中保存了我想要的索引.当然,我可以用代码完成这个:
  1. #include <set>
  2. #include <vector>
  3. #include <iostream>
  4. #include <iterator>
  5.  
  6. template <typename T>
  7. std::vector <T> slice(
  8. std::vector <T> const & x,std::set <unsigned int> const & I
  9. ) {
  10. auto y = std::vector <T> ();
  11. for(auto const & i : I)
  12. y.push_back(x[i]);
  13. return y;
  14. }
  15.  
  16. int main() {
  17. auto x = std::vector <double> { 1.2,2.3,3.4,4.5,5.6};
  18. auto I = std::set <unsigned int> { 0,3,4};
  19. auto y = slice(x,I);
  20. std::copy(y.begin(),y.end(),std::ostream_iterator <double>(
  21. std::cout,"\n"));
  22. }

哪个正确返回

  1. 1.2
  2. 4.5
  3. 5.6

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

解决方法

你可以通过简单地使用std :: transform来实现这个目的:
  1. int main()
  2. {
  3. std::vector<double> x { 1.2,5.6};
  4. std::set<unsigned int> I { 0,4};
  5. std::vector<double> y(I.size());
  6.  
  7. std::transform(I.begin(),I.end(),y.begin(),[&x](unsigned int i) { return x[i]; });
  8.  
  9. std::copy(y.begin(),std::ostream_iterator <double>(std::cout,"\n"));
  10. }

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