4

他の 2 つの配列から配列を作成することは可能ですか? 1 つはソース配列で、もう 1 つは取得する要素のインデックスを含むもので、C++ で、サイクルなしで、たとえば STL やブーストを使用して、1 つのコマンドのみを使用しますか? たとえば、与えられた

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 の機能を使用すると、次のように実行できます。

  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 アレイを使用しているのですか?

于 2012-08-31T09:16:31.087 に答える
3

std-containers と 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 に答える
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 に答える