- [mathjax enable]
- linalg[meta header]
- function template[meta id-type]
- std::linalg[meta namespace]
- cpp26[meta cpp]
namespace std::linalg {
template<inout-object InOutObj1,
inout-object InOutObj2>
void swap_elements(InOutObj1 x,
InOutObj2 y); // (1)
template<class ExecutionPolicy,
inout-object InOutObj1,
inout-object InOutObj2>
void swap_elements(ExecutionPolicy&& exec,
InOutObj1 x,
InOutObj2 y); // (2)
}
- inout-object[link inout-object.md]
同じサイズの2つの行列またはベクトルx
とy
を交換する。
x
とy
の次元が等しくなければならない。
x.rank() == y.rank()
- (1), (2): 0以上
x.rank()
未満の整数rに対して、compatible-static-extents
<InOutVec1, InOutVec2>(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>
void print(Vector v) {
for (int i = 0; i < v.extent(0) - 1; ++i) {
std::cout << v[i] << ", ";
}
std::cout << v[v.extent(0) - 1] << std::endl;
}
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({4, 5, 6});
std::mdspan b(b_vec.data(), N);
// (1)
std::linalg::swap_elements(a, b);
std::cout << "(1)\n";
std::cout << "a\n";
print(a);
std::cout << "b\n";
print(b);
// (2)
std::linalg::swap_elements(std::execution::par, a, b);
std::cout << "(2)\n";
std::cout << "a\n";
print(a);
std::cout << "b\n";
print(b);
return 0;
}
- std::linalg::swap_elements[color ff0000]
(1)
a
4, 5, 6
b
1, 2, 3
(2)
a
1, 2, 3
b
4, 5, 6
- C++26
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??