创建包含向量的特定元素的子向量

时间:2012-03-14 16:34:05

标签: c++

假设一个值为[0,1,2,3,4,5,6,7,8,9]的向量。如何创建一个不一定是连续值的向量,例如: [3,4,7,9],即由一些指数给出,使用STL。

1 个答案:

答案 0 :(得分:3)

您可以将其表达为转换,例如:

#include <valarray>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

template <typename T>
void pick(std::vector<T>& result, const std::vector<T>& in, const std::vector<typename std::vector<T>::size_type>& s) {
  result.reserve(s.size());
  std::transform(s.begin(), s.end(), std::back_inserter(result),
                 [&in](typename std::vector<T>::size_type idx) {
                   return in.at(idx);
                 });
}

int main() {
  const std::vector<int> arr={0,1,2,3,4,5,6,7,8,9,10};
  std::vector<int> result;
  pick(result, arr, {3,4,7,9});
}

我使用了lambda,但您也可以使用std::bind或(现已弃用)std::bind2nd

C ++ 11的std::bind示例使pick

template <typename T>
void pick(std::vector<T>& result, const std::vector<T>& in, const std::vector<typename std::vector<T>::size_type>& s) {
  result.reserve(s.size());
  std::transform(s.begin(), s.end(), std::back_inserter(result),
                 std::bind(static_cast<const T& (std::vector<T>::*)(typename std::vector<T>::size_type) const>(&std::vector<T>::at),  in, std::placeholders::_1));
}

由于at the need to cast the member function pointer to resolve the overload(const vs非const版本),它非常难看。