有没有一种很好的方法来切割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)
然而,这感觉有点笨拙.有没有更好的办法?
您只需使用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)