40#include <initializer_list>
50#ifdef CONSOLE_MULTIARRAY_V1
66 template <
class T,
size_t... Dims>
74 template <
class T,
size_t D>
100 std::copy(init.begin(), init.end(), this->begin());
104 static constexpr size_t rank() {
return 1; }
107 static constexpr size_t fsize() {
return D; }
111 for (
auto &item : *
this) item = value;
121 for (
auto &item : *
this) visit(item);
131 for (
const auto &item : *
this) visit(item);
143 +
" out of range [0, "
144 + std::to_string(
D) +
')');
152 +
" out of range [0, "
153 + std::to_string(
D) +
')');
158 friend std::ostream &
160 if (ma.begin() == ma.end())
return os <<
"[]";
161 auto it = ma.begin();
164 while (++it != ma.end()) {
175 const T *
fbegin()
const {
return this->data(); }
199 static constexpr std::array<size_t, 1>
dims() {
return {
D}; }
206 template <
size_t... Dims>
209 "reshape: total element count must match");
210 return *
reinterpret_cast<MultiArray<
T, Dims...
> *>(
this);
218 template <
size_t... Dims>
221 "reshape: total element count must match");
222 return *
reinterpret_cast<const MultiArray<
T, Dims...
> *>(
this);
232 template <
class T,
size_t First,
size_t... Rest>
234 :
public std::array<MultiArray<T, Rest...>, First> {
259 std::copy(init.begin(), init.end(), this->begin());
263 static constexpr size_t rank() {
return 1 +
sizeof...(Rest); }
272 for (
auto &sub : *
this) sub.fill(value);
281 for (
auto &sub : *
this) sub.for_each(visit);
290 for (
const auto &sub : *
this) sub.for_each(visit);
302 +
" out of range [0, "
303 + std::to_string(First) +
')');
304 return base_type::operator[](idx);
311 +
" out of range [0, "
312 + std::to_string(First) +
')');
313 return base_type::operator[](idx);
323 template <
class... Indices>
325 ->
decltype(base_type::operator[](idx)(rest...)) {
327 sizeof...(Indices) <
rank(),
"Too Many Arguments!");
330 +
" out of range [0, "
331 + std::to_string(First) +
')');
332 return base_type::operator[](idx)(rest...);
336 template <
class... Indices>
338 ->
decltype(base_type::operator[](idx)(rest...)) {
340 sizeof...(Indices) <
rank(),
"Too Many Arguments!");
343 +
" out of range [0, "
344 + std::to_string(First) +
')');
345 return base_type::operator[](idx)(rest...);
349 friend std::ostream &
351 if (ma.begin() == ma.end())
return os <<
"[]";
352 auto it = ma.begin();
354 while (++it != ma.end()) {
361 T *
fbegin() {
return this->data()->fbegin(); }
364 const T *
fbegin()
const {
return this->data()->fbegin(); }
393 static constexpr std::array<size_t,
rank()>
dims() {
394 return {First, Rest...};
402 template <
size_t... Dims>
405 "reshape: total element count must match");
406 return *
reinterpret_cast<MultiArray<
T, Dims...
> *>(
this);
414 template <
size_t... Dims>
417 "reshape: total element count must match");
418 return *
reinterpret_cast<const MultiArray<
T, Dims...
> *>(
this);
423#ifndef CONSOLE_MULTIARRAY_V1
460 template <
class T,
size_t... Dims>
469 template <
class T,
size_t D>
484 template <
class U,
size_t... Dims>
499 = std::reverse_iterator<const_iterator>;
510 std::fill(data_, data_ + SIZE, value);
519 std::copy(init.begin(), init.end(), data_);
528 std::copy(other.data_, other.data_ + SIZE, data_);
538 other.is_views_ =
true;
547 if (
this != &other) {
550 std::copy(other.data_, other.data_ +
SIZE,
data_);
562 if (
this != &other) {
566 other.data_ =
nullptr;
641 static constexpr size_t rank() {
return 1; }
643 static constexpr std::array<size_t,
rank()>
dims() {
return {
D}; }
645 static constexpr size_t fsize() {
return SIZE; }
647 static constexpr bool fempty() {
return SIZE == 0; }
675 +
" out of range [0, "
676 + std::to_string(
D) +
')');
688 +
" out of range [0, "
689 + std::to_string(
D) +
')');
718 static size_t size() {
return D; }
720 static bool empty() {
return D == 0; }
729 template <
class CharT,
class Traits>
730 friend std::basic_ostream<CharT, Traits> &
operator<<(
731 std::basic_ostream<CharT, Traits> &os,
const MultiArray &ma) {
732 if (ma.begin() == ma.end())
return os <<
"[]";
733 auto it = ma.begin();
736 while (++it != ma.end()) {
774 std::swap(
data_, other.data_);
791 template <
size_t... Dims>
794 "reshape: total element count must match");
795 return *
reinterpret_cast<MultiArray<
T, Dims...
> *>(
this);
803 template <
size_t... Dims>
806 "reshape: total element count must match");
807 return *
reinterpret_cast<const MultiArray<
T, Dims...
> *>(
this);
818 template <
class T,
size_t First,
size_t... Rest>
824 template <
size_t... Is>
832 template <
size_t I,
size_t... Is>
837 static constexpr size_t SIZE =
prod<First, Rest...>::value;
846 template <
class U,
size_t... Dims>
1008 = std::reverse_iterator<const_iterator>;
1019 std::fill(data_, data_ + SIZE, value);
1028 std::copy(init.begin(), init.end(), data_);
1038 for (
const auto &sub : init) {
1039 std::copy(sub.fbegin(), sub.fend(), data_ + offset);
1040 offset += sub.fsize();
1050 std::copy(other.data_, other.data_ + SIZE, data_);
1060 other.is_views_ =
true;
1069 if (
this != &other) {
1072 std::copy(other.data_, other.data_ +
SIZE,
data_);
1083 if (
this != &other) {
1085 data_ = other.data_;
1087 other.data_ =
nullptr;
1162 static constexpr size_t rank() {
return 1 +
sizeof...(Rest); }
1164 static constexpr std::array<size_t,
rank()>
dims() {
1165 return {First, Rest...};
1168 static constexpr size_t fsize() {
return SIZE; }
1170 static constexpr bool fempty() {
return SIZE == 0; }
1219 +
" out of range [0, "
1220 + std::to_string(First) +
')');
1232 +
" out of range [0, "
1233 + std::to_string(First) +
')');
1260 template <
class... Indices>
1262 ->
decltype(
at(idx)(rest...)) {
1264 sizeof...(Indices) <
rank(),
"Too Many Arguments!");
1265 return at(idx)(rest...);
1275 template <
class... Indices>
1276 auto operator()(
size_t idx, Indices... rest)
const
1277 ->
decltype(
at(idx)(rest...)) {
1279 sizeof...(Indices) <
rank(),
"Too Many Arguments!");
1280 return at(idx)(rest...);
1284#if __cplusplus >= 202302L
1293 template <
class... Indices>
1294 auto operator[](
size_t idx, Indices... rest)
1295 ->
decltype(operator[](idx)[rest...]) {
1297 sizeof...(Indices) < rank(),
"Too Many Arguments!");
1298 return operator[](idx)[rest...];
1308 template <
class... Indices>
1309 auto operator[](
size_t idx, Indices... rest)
const
1310 ->
decltype(operator[](idx)[rest...]) {
1312 sizeof...(Indices) < rank(),
"Too Many Arguments!");
1313 return operator[](idx)[rest...];
1327 static size_t size() {
return First; }
1329 static bool empty() {
return First == 0; }
1331 static size_t max_size() {
return First; }
1338 template <
class CharT,
class Traits>
1339 friend std::basic_ostream<CharT, Traits> &
operator<<(
1340 std::basic_ostream<CharT, Traits> &os,
const MultiArray &ma) {
1341 if (ma.begin() == ma.end())
return os <<
"[]";
1342 auto it = ma.begin();
1345 while (++it != ma.end()) {
1383 std::swap(
data_, other.data_);
1400 template <
size_t... Dims>
1403 "reshape: total element count must match");
1404 return *
reinterpret_cast<MultiArray<
T, Dims...
> *>(
this);
1412 template <
size_t... Dims>
1415 "reshape: total element count must match");
1416 return *
reinterpret_cast<const MultiArray<
T, Dims...
> *>(
this);
1422#define ARRAY_AND_ARRAY(OP) \
1423 template <class T, class U, size_t... Dims> \
1424 MultiArray<decltype(std::declval<T>() OP std::declval<U>()), Dims...> \
1425 operator OP(const MultiArray<T, Dims...> &a, \
1426 const MultiArray<U, Dims...> &b) { \
1427 MultiArray<decltype(std::declval<T>() OP std::declval<U>()), Dims...> \
1429 auto ai = a.fbegin(); \
1430 auto bi = b.fbegin(); \
1431 auto ci = c.fbegin(); \
1432 while (ci != c.fend()) *ci++ = *ai++ OP *bi++; \
1436#define ARRAY_AND_SCALAR(OP) \
1437 template <class T, class U, size_t... Dims> \
1438 MultiArray<decltype(std::declval<T>() OP std::declval<U>()), Dims...> \
1439 operator OP(const MultiArray<T, Dims...> &a, const U &b) { \
1440 MultiArray<decltype(std::declval<T>() OP std::declval<U>()), Dims...> \
1442 auto ai = a.fbegin(); \
1443 auto ci = c.fbegin(); \
1444 while (ci != c.fend()) *ci++ = *ai++ OP b; \
1448#define SCALAR_AND_ARRAY(OP) \
1449 template <class T, class U, size_t... Dims> \
1450 MultiArray<decltype(std::declval<T>() OP std::declval<U>()), Dims...> \
1451 operator OP(const U &a, const MultiArray<T, Dims...> &b) { \
1452 MultiArray<decltype(std::declval<T>() OP std::declval<U>()), Dims...> \
1454 auto bi = b.fbegin(); \
1455 auto ci = c.fbegin(); \
1456 while (ci != c.fend()) *ci++ = a OP *bi++; \
1460#define ARRAY_AND_ARRAY_INPLACE(OP) \
1461 template <class T, class U, size_t... Dims> \
1462 MultiArray<T, Dims...> & operator OP( \
1463 MultiArray<T, Dims...> &a, \
1464 const MultiArray<U, Dims...> &b) { \
1465 auto ai = a.fbegin(); \
1466 auto bi = b.fbegin(); \
1467 while (ai != a.fend()) *ai++ OP *bi++; \
1471#define ARRAY_AND_SCALAR_INPLACE(OP) \
1472 template <class T, class U, size_t... Dims> \
1473 MultiArray<T, Dims...> & operator OP(MultiArray<T, Dims...> &a, \
1475 auto ai = a.fbegin(); \
1476 while (ai != a.fend()) *ai++ OP b; \
1480#define ARRAY_AND_ARRAY_BOOL(OP) \
1481 template <class T, class U, size_t... Dims> \
1482 MultiArray<bool, Dims...> \
1483 operator OP(const MultiArray<T, Dims...> &a, \
1484 const MultiArray<U, Dims...> &b) { \
1485 MultiArray<bool, Dims...> c; \
1486 auto ai = a.fbegin(); \
1487 auto bi = b.fbegin(); \
1488 auto ci = c.fbegin(); \
1489 while (ci != c.fend()) *ci++ = *ai++ OP *bi++; \
1493#define ARRAY_AND_SCALAR_BOOL(OP) \
1494 template <class T, class U, size_t... Dims> \
1495 MultiArray<bool, Dims...> \
1496 operator OP(const MultiArray<T, Dims...> &a, const U &b) { \
1497 MultiArray<bool, Dims...> c; \
1498 auto ai = a.fbegin(); \
1499 auto ci = c.fbegin(); \
1500 while (ci != c.fend()) *ci++ = *ai++ OP b; \
1504#define SCALAR_AND_ARRAY_BOOL(OP) \
1505 template <class T, class U, size_t... Dims> \
1506 MultiArray<bool, Dims...> \
1507 operator OP(const U &a, const MultiArray<T, Dims...> &b) { \
1508 MultiArray<bool, Dims...> c; \
1509 auto bi = b.fbegin(); \
1510 auto ci = c.fbegin(); \
1511 while (ci != c.fend()) *ci++ = a OP *bi++; \
1515#define UNARY_ARRAY(OP) \
1516 template <class T, size_t... Dims> \
1517 MultiArray<decltype(OP std::declval<T>()), Dims...> \
1518 operator OP(const MultiArray<T, Dims...> &a) { \
1519 MultiArray<decltype(OP std::declval<T>()), Dims...> c; \
1520 auto ai = a.fbegin(); \
1521 auto ci = c.fbegin(); \
1522 while (ci != c.fend()) *ci++ = OP *ai++; \
1526#define UNARY_ARRAY_BOOL(OP) \
1527 template <class T, size_t... Dims> \
1528 MultiArray<bool, Dims...> \
1529 operator OP(const MultiArray<T, Dims...> &a) { \
1530 MultiArray<bool, Dims...> c; \
1531 auto ai = a.fbegin(); \
1532 auto ci = c.fbegin(); \
1533 while (ci != c.fend()) *ci++ = OP *ai++; \
1628 template <class T, class U,
size_t... Dims>
1629 typename std::enable_if<!std::is_base_of<std::ios_base, U>::value,
1630 MultiArray<decltype(std::declval<U>() << std::declval<T>()),
1632 operator<<(const U &value, const
MultiArray<T, Dims...> &a) {
1634 auto ai = a.fbegin();
1635 auto bi = b.fbegin();
1636 while (bi != b.fend()) *bi++ = value << *ai++;
1646#undef ARRAY_AND_ARRAY
1647#undef ARRAY_AND_SCALAR
1648#undef SCALAR_AND_ARRAY
1649#undef ARRAY_AND_ARRAY_INPLACE
1650#undef ARRAY_AND_SCALAR_INPLACE
1651#undef ARRAY_AND_ARRAY_BOOL
1652#undef ARRAY_AND_SCALAR_BOOL
1653#undef SCALAR_AND_ARRAY_BOOL
1655#undef UNARY_ARRAY_BOOL
1664 template <
class T,
size_t... Dims>
1667 a.for_each([&](
const T &ref) { result += ref; });
1675 template <
class T,
size_t... Dims>
1677 return *std::min_element(a.fbegin(), a.fend());
1684 template <
class T,
size_t... Dims>
1686 return *std::max_element(a.fbegin(), a.fend());
1693 template <
class T,
size_t... Dims>
1695 for (
auto it = a.fbegin(); it != a.fend(); ++it)
1696 if (!*it)
return false;
1704 template <
class T,
size_t... Dims>
1706 for (
auto it = a.fbegin(); it != a.fend(); ++it)
1707 if (*it)
return true;
1715 template <
class T,
class U,
size_t... Dims>
1718 for (
size_t i = 0; i < a.fsize(); ++i)
1719 if (a[i] != b[i])
return false;
1727 template <
class T,
class U,
size_t... Dims1,
size_t... Dims2>
1737 template <
class T,
class U,
size_t... Dims,
class Op>
1741 for (
size_t i = 0; i < a.fsize(); ++i)
1742 if (!op(a[i], b[i]))
return false;
1750 template <
class T,
class U,
size_t... Dims1,
size_t... Dims2,
class Op>
1761 template <
class T,
class U,
size_t... Dims>
1764 for (
auto it1 = a.fbegin(), it2 = b.fbegin();
1767 if (*it1 < *it2)
return -1;
1768 if (*it2 < *it1)
return 1;
const T & const_reference
Definition multiarray.h:81
static constexpr size_t fsize()
返回元素总数。
Definition multiarray.h:107
void for_each(F &&visit)
遍历所有元素并应用函数(非常量版本)。
Definition multiarray.h:120
const MultiArray & flatten() const
扁平化视图(常量)。
Definition multiarray.h:193
const_reference operator()(size_t i) const
常量版本。
Definition multiarray.h:149
static constexpr std::array< size_t, 1 > dims()
返回包含维度信息的数组。
Definition multiarray.h:199
void fill(const T &value)
用给定值填充所有元素。
Definition multiarray.h:110
MultiArray(const base_type &other)
从 std::array 拷贝构造。
Definition multiarray.h:93
friend std::ostream & operator<<(std::ostream &os, const MultiArray &ma)
输出 MultiArray 到流,格式为嵌套的方括号。
Definition multiarray.h:159
MultiArray(const T &value)
用相同值填充所有元素。
Definition multiarray.h:90
T * fbegin()
返回指向扁平化数据起始的指针(非常量)。
Definition multiarray.h:172
const MultiArray< T, Dims... > & reshape() const
重新调整数组的形状(const版本)。
Definition multiarray.h:219
MultiArray< T, Dims... > & reshape()
重新调整数组的形状。
Definition multiarray.h:207
const T * fend() const
常量版本。
Definition multiarray.h:181
std::array< T, D > base_type
Definition multiarray.h:76
reference operator()(size_t i)
带边界检查的下标访问(一维)。
Definition multiarray.h:140
T * fend()
返回指向扁平化数据末尾的指针(非常量)。
Definition multiarray.h:178
const T * fbegin() const
常量版本。
Definition multiarray.h:175
T value_type
Definition multiarray.h:79
MultiArray()=default
默认构造,元素未初始化(基本类型为随机值)。
void for_each(F &&visit) const
遍历所有元素并应用函数(常量版本)。
Definition multiarray.h:130
MultiArray & flatten()
扁平化视图(可变)。
Definition multiarray.h:187
T & reference
Definition multiarray.h:80
MultiArray(std::initializer_list< T > init)
从初始化列表构造(仅一维)。
Definition multiarray.h:99
static constexpr size_t rank()
返回数组的维数(一维时为 1)。
Definition multiarray.h:104
MultiArray< T, Rest... > & reference
Definition multiarray.h:239
std::array< MultiArray< T, Rest... >, First > base_type
Definition multiarray.h:235
static constexpr std::array< size_t, rank()> dims()
返回包含维度信息的数组。
Definition multiarray.h:393
void for_each(F &&visit)
遍历所有元素(非常量版本)。
Definition multiarray.h:280
static constexpr size_t rank()
返回数组维数。
Definition multiarray.h:263
auto operator()(size_t idx, Indices... rest) const -> decltype(base_type::operator[](idx)(rest...))
常量版本。
Definition multiarray.h:337
friend std::ostream & operator<<(std::ostream &os, const MultiArray &ma)
输出 MultiArray 到流,递归输出嵌套方括号。
Definition multiarray.h:350
T * fend()
扁平化结束迭代器(非常量)。
Definition multiarray.h:367
MultiArray(std::initializer_list< MultiArray< T, Rest... > > init)
从初始化列表构造(多维)。
Definition multiarray.h:258
MultiArray< T, fsize()> & flatten()
扁平化视图(可变)。
Definition multiarray.h:376
const T * fbegin() const
常量版本。
Definition multiarray.h:364
void fill(const T &value)
递归填充所有元素。
Definition multiarray.h:271
const MultiArray< T, Rest... > & const_reference
Definition multiarray.h:240
const MultiArray< T, Dims... > & reshape() const
重新调整数组的形状(const版本)。
Definition multiarray.h:415
void for_each(F &&visit) const
遍历所有元素(常量版本)。
Definition multiarray.h:289
T * fbegin()
扁平化起始迭代器(非常量)。
Definition multiarray.h:361
MultiArray< T, Rest... > value_type
Definition multiarray.h:238
const MultiArray< T, fsize()> & flatten() const
扁平化视图(常量)。
Definition multiarray.h:384
static constexpr size_t fsize()
返回元素总数。
Definition multiarray.h:266
const T * fend() const
常量版本。
Definition multiarray.h:370
MultiArray()=default
默认构造。
MultiArray(const base_type &other)
从 std::array 拷贝构造。
Definition multiarray.h:252
reference operator()(size_t idx)
单下标访问,返回子数组引用。
Definition multiarray.h:299
auto operator()(size_t idx, Indices... rest) -> decltype(base_type::operator[](idx)(rest...))
多维下标访问。
Definition multiarray.h:324
MultiArray(const T &value)
用相同值递归填充所有元素。
Definition multiarray.h:249
const_reference operator()(size_t idx) const
常量版本。
Definition multiarray.h:308
MultiArray< T, Dims... > & reshape()
重新调整数组的形状。
Definition multiarray.h:403
编译期固定维度的多维数组。
Definition multiarray.h:67
size_t size_type
Definition multiarray.h:489
const_iterator cbegin() const
const 迭代器 cbegin,返回指向首元素的 const 迭代器。
Definition multiarray.h:614
static constexpr size_t SIZE
< 是否为视图
Definition multiarray.h:475
reverse_iterator rend()
反向迭代器 rend,返回指向首元素的反向迭代器。
Definition multiarray.h:602
static constexpr size_t rank()
维度,返回 1。
Definition multiarray.h:640
static size_t max_size()
第一维最大大小,返回 D。
Definition multiarray.h:721
const_reverse_iterator crend() const
const 反向迭代器 crend,返回指向首元素的 const 反向迭代器。
Definition multiarray.h:626
static size_t size()
第一维元素数量,返回 D。
Definition multiarray.h:717
reference operator[](size_t index)
下标运算符,返回指向 index 位置的引用。
Definition multiarray.h:657
const_reverse_iterator crbegin() const
const 反向迭代器 crbegin,返回指向尾元素的 const 反向迭代器。
Definition multiarray.h:622
std::reverse_iterator< iterator > reverse_iterator
Definition multiarray.h:497
T * fbegin()
扁平化迭代器,返回指向首元素的指针。
Definition multiarray.h:631
void for_each(F f)
遍历所有元素并应用函数。
Definition multiarray.h:754
void swap(MultiArray &other) noexcept
交换两个数组的内容。
Definition multiarray.h:772
iterator begin()
迭代器 begin,返回指向首元素的迭代器。
Definition multiarray.h:582
static constexpr bool fempty()
扁平化是否为空,返回 SIZE == 0。
Definition multiarray.h:646
static constexpr size_t fsize()
扁平化大小,返回 SIZE。
Definition multiarray.h:644
MultiArray< T, Dims... > & reshape()
重新调整数组的形状。
Definition multiarray.h:791
value_type & reference
Definition multiarray.h:493
T value_type
Definition multiarray.h:488
value_type * pointer
Definition multiarray.h:491
const value_type * const_pointer
Definition multiarray.h:492
static bool empty()
第一维是否为空,返回 D == 0。
Definition multiarray.h:719
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition multiarray.h:498
MultiArray(const T *data, bool is_views)
私有构造函数,const 版本,仅供 const 视图使用。
Definition multiarray.h:481
reference at(size_t index)
带边界检查的下标访问。
Definition multiarray.h:671
iterator end()
迭代器 end,返回指向尾元素的迭代器。
Definition multiarray.h:586
MultiArray< T, SIZE > & flatten()
扁平化视图,一维数组返回自身。
Definition multiarray.h:651
const value_type * const_iterator
Definition multiarray.h:496
reverse_iterator rbegin()
反向迭代器 rbegin,返回指向尾元素的反向迭代器。
Definition multiarray.h:598
ptrdiff_t difference_type
Definition multiarray.h:490
value_type * iterator
Definition multiarray.h:495
friend class MultiArray
Definition multiarray.h:485
reference operator()(size_t index)
带边界检查的下标访问。
Definition multiarray.h:698
void fill(const T &value)
用给定值填充所有元素。
Definition multiarray.h:746
MultiArray clone() const
显式深拷贝,返回独立拥有者。
Definition multiarray.h:574
static constexpr std::array< size_t, rank()> dims()
维度数组,返回 {D}。
Definition multiarray.h:642
static constexpr size_t fmax_size()
扁平化最大大小,返回 SIZE。
Definition multiarray.h:648
reference front()
访问第一个元素。
Definition multiarray.h:708
const value_type & const_reference
Definition multiarray.h:494
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const MultiArray &ma)
流输出,格式为嵌套方括号。
Definition multiarray.h:729
MultiArray & operator=(const MultiArray &other)
拷贝赋值,深拷贝,目标变为拥有者。
Definition multiarray.h:545
T * fend()
扁平化迭代器,返回指向尾元素的指针。
Definition multiarray.h:635
const_iterator cend() const
const 迭代器 cend,返回指向尾元素的 const 迭代器。
Definition multiarray.h:618
reference back()
访问最后一个元素。
Definition multiarray.h:712
MultiArray(T *data, bool is_views)
私有构造函数,仅供视图创建使用。
Definition multiarray.h:478
const 随机访问迭代器。
Definition multiarray.h:928
ptrdiff_t difference_type
Definition multiarray.h:934
const_iterator & operator--()
Definition multiarray.h:951
const_iterator & operator-=(difference_type n)
Definition multiarray.h:993
pointer operator->() const
Definition multiarray.h:939
const_iterator & operator+=(difference_type n)
Definition multiarray.h:989
const_iterator operator--(int)
Definition multiarray.h:955
const_iterator(const T *ptr)
Definition multiarray.h:937
const_iterator operator++(int)
Definition multiarray.h:946
std::shared_ptr< value_type > pointer
Definition multiarray.h:935
friend bool operator!=(const const_iterator &a, const const_iterator &b)
Definition multiarray.h:968
const T * ptr_
Definition multiarray.h:929
value_type reference
Definition multiarray.h:936
friend const_iterator operator+(const_iterator it, difference_type n)
Definition multiarray.h:980
friend bool operator==(const const_iterator &a, const const_iterator &b)
Definition multiarray.h:964
friend const_iterator operator+(difference_type n, const_iterator it)
Definition multiarray.h:985
std::random_access_iterator_tag iterator_category
Definition multiarray.h:932
reference operator*() const
Definition multiarray.h:938
friend bool operator<(const const_iterator &a, const const_iterator &b)
Definition multiarray.h:972
reference operator[](difference_type n) const
Definition multiarray.h:960
const_iterator & operator++()
Definition multiarray.h:942
friend difference_type operator-(const const_iterator &a, const const_iterator &b)
Definition multiarray.h:976
const MultiArray< T, Rest... > value_type
Definition multiarray.h:933
随机访问迭代器,遍历第一维的子数组。
Definition multiarray.h:858
reference operator[](difference_type n) const
Definition multiarray.h:890
iterator(T *ptr)
Definition multiarray.h:867
iterator & operator--()
Definition multiarray.h:881
iterator & operator++()
Definition multiarray.h:872
value_type reference
Definition multiarray.h:866
reference operator*() const
Definition multiarray.h:868
T * ptr_
Definition multiarray.h:859
friend bool operator!=(const iterator &a, const iterator &b)
Definition multiarray.h:896
friend iterator operator+(iterator it, difference_type n)
Definition multiarray.h:906
MultiArray< T, Rest... > value_type
Definition multiarray.h:863
iterator & operator-=(difference_type n)
Definition multiarray.h:918
friend bool operator==(const iterator &a, const iterator &b)
Definition multiarray.h:893
friend difference_type operator-(const iterator &a, const iterator &b)
Definition multiarray.h:903
iterator operator++(int)
Definition multiarray.h:876
iterator operator--(int)
Definition multiarray.h:885
std::shared_ptr< value_type > pointer
Definition multiarray.h:865
friend iterator operator+(difference_type n, iterator it)
Definition multiarray.h:910
ptrdiff_t difference_type
Definition multiarray.h:864
friend bool operator<(const iterator &a, const iterator &b)
Definition multiarray.h:899
iterator & operator+=(difference_type n)
Definition multiarray.h:914
std::random_access_iterator_tag iterator_category
Definition multiarray.h:862
pointer operator->() const
Definition multiarray.h:869
reverse_iterator rbegin()
反向迭代器 rbegin,返回指向尾元素的反向迭代器。
Definition multiarray.h:1119
static constexpr size_t SIZE
Definition multiarray.h:837
static constexpr bool fempty()
静态成员函数 fempty,返回数组是否为空。
Definition multiarray.h:1169
const value_type const_reference
const 视图
Definition multiarray.h:1005
reference back()
访问最后一个子数组。
Definition multiarray.h:1321
reference at(size_t index)
带边界检查的子数组访问。
Definition multiarray.h:1215
value_type reference
视图(值类型)
Definition multiarray.h:1004
ptrdiff_t difference_type
Definition multiarray.h:1001
const value_type * const_pointer
Definition multiarray.h:1003
reference operator()(size_t index)
带边界检查的子数组访问。
Definition multiarray.h:1242
std::reverse_iterator< iterator > reverse_iterator
Definition multiarray.h:1006
const_reverse_iterator crbegin() const
const 反向迭代器 crbegin,返回指向尾元素的 const 反向迭代器。
Definition multiarray.h:1143
const_iterator cbegin() const
const 迭代器 cbegin,返回指向首元素的 const 迭代器。
Definition multiarray.h:1135
static constexpr size_t fsize()
静态成员函数 fsize,返回数组的元素个数。
Definition multiarray.h:1167
void swap(MultiArray &other) noexcept
交换两个数组的内容。
Definition multiarray.h:1381
void for_each(F f)
遍历所有元素并应用函数。
Definition multiarray.h:1363
static size_t size()
第一维元素数量,返回 First。
Definition multiarray.h:1326
MultiArray(const T *data, bool is_views)
私有构造函数,const 版本。
Definition multiarray.h:843
static constexpr size_t rank()
静态成员函数 rank,返回数组的维度。
Definition multiarray.h:1161
size_t size_type
Definition multiarray.h:1000
const_reverse_iterator crend() const
const 反向迭代器 crend,返回指向首元素的 const 反向迭代器。
Definition multiarray.h:1147
MultiArray clone() const
显式深拷贝,返回独立拥有者。
Definition multiarray.h:1095
reverse_iterator rend()
反向迭代器 rend,返回指向首元素的反向迭代器。
Definition multiarray.h:1123
iterator end()
迭代器 end,返回指向尾元素的迭代器。
Definition multiarray.h:1107
const_iterator cend() const
const 迭代器 cend,返回指向尾元素的 const 迭代器。
Definition multiarray.h:1139
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition multiarray.h:1007
reference front()
若是C++23及以上版本,提供不进行边界检查的多维下标访问。
Definition multiarray.h:1317
reference operator[](size_t index)
访问第一维的子数组。
Definition multiarray.h:1196
value_type * pointer
Definition multiarray.h:1002
MultiArray< T, Dims... > & reshape()
重新调整数组的形状。
Definition multiarray.h:1400
MultiArray & operator=(const MultiArray &other)
拷贝赋值,深拷贝。
Definition multiarray.h:1067
MultiArray(T *data, bool is_views)
私有构造函数,仅供视图创建使用。
Definition multiarray.h:840
MultiArray< T, Rest... > value_type
Definition multiarray.h:999
friend class MultiArray
Definition multiarray.h:847
MultiArray< T, SIZE > & flatten()
扁平化视图,将多维数组视为一维数组。
Definition multiarray.h:1178
void fill(const T &value)
用给定值填充所有元素。
Definition multiarray.h:1355
static constexpr size_t fmax_size()
静态成员函数 fmax_size,返回数组的最大元素个数。
Definition multiarray.h:1171
T * fbegin()
扁平迭代器 fbegin,返回指向首元素的指针。
Definition multiarray.h:1152
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const MultiArray &ma)
流输出,递归输出嵌套方括号。
Definition multiarray.h:1338
static bool empty()
第一维是否为空,返回 First == 0。
Definition multiarray.h:1328
iterator begin()
迭代器 begin,返回指向首元素的迭代器。
Definition multiarray.h:1103
static size_t max_size()
第一维最大大小,返回 First。
Definition multiarray.h:1330
static constexpr std::array< size_t, rank()> dims()
静态成员函数 dims,返回数组的维度数组。
Definition multiarray.h:1163
T * fend()
扁平迭代器 fend,返回指向尾元素的指针。
Definition multiarray.h:1156
编译期固定维度的多维数组(堆版本)。
Definition multiarray.h:461
MultiArrayError(const std::string &msg)
构造 MultiArrayError。
Definition csexc.h:127
定义 console 库使用的自定义异常类层次结构。
std::enable_if< is_string< typenamestd::decay< T >::type >::value >::type repr(T &&value, std::basic_ostream< CharT, Traits > &os=std::cout)
输出字符串类型(std::string, const char* 等)的表示,带双引号。
Definition repr.h:97
#define ARRAY_AND_ARRAY_BOOL(OP)
Definition multiarray.h:1480
#define UNARY_ARRAY_BOOL(OP)
Definition multiarray.h:1526
#define ARRAY_AND_SCALAR_BOOL(OP)
Definition multiarray.h:1493
#define ARRAY_AND_SCALAR_INPLACE(OP)
Definition multiarray.h:1471
#define ARRAY_AND_ARRAY(OP)
Definition multiarray.h:1422
#define ARRAY_AND_ARRAY_INPLACE(OP)
Definition multiarray.h:1460
#define ARRAY_AND_SCALAR(OP)
Definition multiarray.h:1436
#define SCALAR_AND_ARRAY(OP)
Definition multiarray.h:1448
#define UNARY_ARRAY(OP)
Definition multiarray.h:1515
#define SCALAR_AND_ARRAY_BOOL(OP)
Definition multiarray.h:1504
Definition multiarray.h:54
Definition multiarray.h:426
bool all(const MultiArray< T, Dims... > &a)
检查所有元素是否都为 true(逻辑与归约)。
Definition multiarray.h:1694
T min(const MultiArray< T, Dims... > &a)
求最小值。
Definition multiarray.h:1676
bool any(const MultiArray< T, Dims... > &a)
检查是否存在至少一个 true 元素(逻辑或归约)。
Definition multiarray.h:1705
T max(const MultiArray< T, Dims... > &a)
求最大值。
Definition multiarray.h:1685
int compare(const MultiArray< T, Dims... > &a, const MultiArray< U, Dims... > &b)
比较两个 MultiArray 的大小。
Definition multiarray.h:1763
T sum(const MultiArray< T, Dims... > &a)
求和所有元素。
Definition multiarray.h:1665
bool equals(const MultiArray< T, Dims... > &a, const MultiArray< U, Dims... > &b)
检查两个 MultiArray 是否相等。
Definition multiarray.h:1717
提供类似 Python 的 repr() 函数,用于生成对象的可读字符串表示。
编译期固定维度的多维数组元数据。
Definition multiarray.h:433
T * data_
指向堆内存数据的指针
Definition multiarray.h:434
_multi_array_base(T *data, bool is_views)
构造函数。
Definition multiarray.h:442
bool is_views_
true 表示视图(不拥有数据),false 表示拥有者
Definition multiarray.h:435
static constexpr size_t value
Definition multiarray.h:834
static constexpr size_t value
Definition multiarray.h:829
< 是否为视图
Definition multiarray.h:825