在C++中高效构建一个数组,该数组包含从另一个数组中取出指定索引位置的元素

4

在C++中,是否有可能使用一个命令从两个数组创建一个数组,其中一个是源数组,另一个包含要取的元素的索引,而且不需要循环,例如使用STL或boost?例如,给定以下数组:

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

并且

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

I would want to have

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

作为结果。 在MATLAB中,我会简单地写一些像X(n)这样的内容。

你的意思是即使不使用条件语句和循环语句也可以实现吗? - Coding Mash
你可能会在这里找到一些有用的东西 https://dev59.com/TmfWa4cB1Zd3GeqPkcld#ZGEFoYgBc1ULPQZFVX0n - mathematician1975
3
我经常对像这样的问题中使用“高效”一词感到困惑。代码可以有很多高效的方法,但不幸的是,我认为大多数提问者的意思是“使用尽可能少的代码”或“在向我的教授展示它时不会让我难堪”。 - john
在这种情况下,最明显的方法是使用1个循环和2行,这也是最有效的方法。不过我不知道你的限制来自哪里。 - SingerOfTheFall
我怀疑你不能像那样初始化一个自由数组,但是可以想象你可以从给定的索引数组初始化模板类成员数组,例如 double arr { get_index<I>(src)... };,其中 int ...I 是一个包。 - Kerrek SB
显示剩余2条评论
3个回答

4
使用c++11特性,您可以按照以下方式完成此操作:
  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));

此外,为什么你在使用STL容器之前要使用 C 数组呢?

第一条消息中有一个错别字。第三行应该是Y而不是X。因此,所有数组的大小都是固定的,所以在我的情况下使用数组和向量似乎没有太大区别。 - G-s

3
假设您使用标准容器和C++11(抱歉,未经测试):
std::transform(n.begin(), n.end(), std::back_inserter(Y), [&X](int i) { return X[i]});
X = std::move(Y);

3

以下是一个与IT技术半相关的静态工作方案:

#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; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接