4

是否可以从其他两个数组创建一个数组,一个是源数组,第二个包含要获取的元素的索引,在 C++ 中,只使用一个命令,没有循环,例如,使用 STL 或 boost?例如,给定

double X[10] = [10., 9., 8., 7., 6., 5., 4., 3., 2., 1.];

int n[4] =  [0, 1, 3, 9];

我想拥有

double X[4] = [10., 9., 7., 1.]

作为结果。在 MATLAB 中,我会简单地编写类似 X(n) 的内容。

4

3 回答 3

4

使用 c++11-features 你可以这样做:

  std::vector<double> vec;
  std::transform(std::begin(n), std::end(n), std::back_inserter(vec), [&](int idx)
  {
    return x[idx];
  });

如果没有 c++11,它可能看起来像这样:

template <typename T, std::size_t N>
struct Get_Idx
{
  Get_Idx(T (&t)[N]) : m_t(t) { }

  T (&m_t)[N];

  T operator()(std::size_t i) const
  {
    return m_t[i];
  }
};

template <typename T, std::size_t N>
Get_Idx<T, N> get_idx(T (&t) [N])
{
  return Get_Idx<T, N>(t);
}

  std::vector<double> vec2;
  std::transform(n, n + 4, std::back_inserter(vec2), get_idx(x));

此外,您为什么使用 c 数组而不是 STL 容器?

于 2012-08-31T09:16:31.087 回答
3

这是半相关的,只能静态工作的东西:

#include <array>

template <typename T, unsigned int ...I, typename U, unsigned int N>
std::array<T, sizeof...(I)> build_array(U const (&src)[N])
{
    return std::array<T, sizeof...(I)> { { static_cast<T>(src[I])... } };
}

用法:

auto arr = build_array<int, 0, 1, 3, 9>(X);

例子:

#include <iostream>

int main()
{
    double X[10] = { 10., 9., 8., 7., 6., 5., 4., 3., 2., 1. };
    auto arr = build_array<int, 0, 1, 3, 9>(X);

    for (auto i : arr) { std::cout << i << std::endl; }
}
于 2012-08-31T09:08:47.570 回答
3

假设您使用标准容器和 C++11(抱歉,未经测试):

std::transform(n.begin(), n.end(), std::back_inserter(Y), [&X](int i) { return X[i]});
X = std::move(Y);
于 2012-08-31T09:04:55.770 回答