namespace std::linalg {
template<in-object InObj,
out-object OutObj>
void copy(InObj x,
OutObj y); // (1)
template<class ExecutionPolicy,
in-object InObj,
out-object OutObj>
void copy(ExecutionPolicy&& exec,
InObj x,
OutObj y); // (2)
}
概要
同じサイズの行列またはベクトルのx
とy
に対して、x
をy
にコピーする。
テンプレートパラメータ制約
x
とy
の次元が等しくなければならない。
x.rank() == y.rank()
適格要件
- (1), (2): 0以上
x.rank()
未満の整数r
に対して、compatible-static-extents<InVec, OutVec>(r,r)
がtrue
- (2):
is_execution_policy<ExecutionPolicy>::value
がtrue
事前条件
x
とy
の各次元の要素数が等しくなければならない。
x.extents() == y.extents()
効果
x
の各成分をy
にコピーする。
- (1): 逐次実行する。
- (2): 指定された実行ポリシーに応じて実行する。
戻り値
なし
例
[注意] 処理系にあるコンパイラで確認していないため、間違っているかもしれません。
#include <cmath>
#include <execution>
#include <iostream>
#include <linalg>
#include <mdspan>
#include <vector>
template <class Vector>
bool IsEqual(Vector a, Vector b) {
if (a.extent(0) != b.extent(0)) {
return false;
}
for (int i = 0; i < a.extent(0); ++i) {
if (a[i] != b[i]) {
return false;
}
}
return true;
}
int main()
{
constexpr size_t N = 3;
std::vector<double> a_vec({1, 2, 3});
std::mdspan a(a_vec.data(), N);
std::vector<double> b_vec(N);
std::mdspan b(b_vec.data(), N);
// (1)
std::linalg::copy(a, b);
assert(IsEqual(a, b));
// (2)
std::linalg::copy(std::execution::par, a, b);
assert(IsEqual(a, b));
return 0;
}
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??