最初は、これは何らかの理由でC ++の質問だと思いました!
C ++を使用できる場合は、STL配列を使用できる可能性があります(サイズはテンプレートパラメーターであり、格納されている値ではありません)。
次のようになります。
std::array<double, 7> a = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0};
std::array<double, 7> b = {0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
auto c = a + b;
auto d = a + b + c;
また、operator+の演算子オーバーロードを定義できます。例えば:
#include <array>
// ...
// (version 1) returns a new copy/temporary
template <class T, size_t size>
std::array<T, size> operator+(const std::array<T, size>& a,
const std::array<T, size>& b)
{
std::array<T, size> c;
// add them however you want; simple version:
for (size_t i = 0; i < size; ++i)
{
c[i] = a[i] + b[i];
}
return c;
}
// (version 2) no temporaries via rvalue ref/move semantic
template <class T, size_t size>
std::array<T, size>&& operator+(std::array<T, size>&& a,
const std::array<T, size>& b)
{
for (size_t i = 0; i < size; ++i)
{
a[i] += b[i];
}
return std::move(a);
}
となることによって:
auto c = a + b; // invokes version 1
auto d = a + b + c; // invokes version 1 for (b+c)
// and then version 2 for a+(temp)
したがって、操作のチェーンで一時的に使用するのは最大で1つです。
std :: arrayのメモリレイアウトはネイティブ配列と同じである必要があるため、必要に応じて、このコードを既存のプログラムに(キャスト、typedef、またはプリプロセッサを(ab)使用して)非常に簡単に「挿入」できるはずです。最小限の既存のコードに触れること。