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