有没有一种很好的方法来根据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")); }