39#include <initializer_list>
56 template <
class T,
size_t... Dims>
64 template <
class T,
size_t D>
67 using base_type = std::array<T, D>;
95 std::copy(init.begin(), init.end(), this->begin());
99 static constexpr size_t rank() {
return 1; }
102 static constexpr size_t fsize() {
return D; }
107 for (
auto &item : *
this)
119 for (
auto &item : *
this)
131 for (
const auto &item : *
this)
147 " out of range [0, " +
160 " out of range [0, " +
169 if (ma.begin() == ma.end())
171 auto it = ma.begin();
174 while (++it != ma.end())
186 const T *
fbegin()
const {
return this->data(); }
216 static constexpr std::array<size_t, 1>
dims()
228 template <
class T,
size_t First,
size_t... Rest>
230 :
public std::array<MultiArray<T, Rest...>, First>
232 using base_type = std::array<
MultiArray<
T, Rest...>, First>;
260 std::copy(init.begin(), init.end(), this->begin());
264 static constexpr size_t rank() {
return 1 +
sizeof...(Rest); }
275 for (
auto &sub : *
this)
286 for (
auto &sub : *
this)
297 for (
const auto &sub : *
this)
312 std::to_string(idx) +
313 " out of range [0, " +
314 std::to_string(First) +
316 return base_type::operator[](idx);
325 std::to_string(idx) +
326 " out of range [0, " +
327 std::to_string(First) +
329 return base_type::operator[](idx);
339 template <
class... Indices>
341 ->
decltype(base_type::operator[](idx)(rest...))
343 static_assert(
sizeof...(Indices) <
rank(),
344 "Too Many Arguments!");
348 std::to_string(idx) +
349 " out of range [0, " +
350 std::to_string(First) +
352 return base_type::operator[](idx)(rest...);
356 template <
class... Indices>
358 ->
decltype(base_type::operator[](idx)(rest...))
360 static_assert(
sizeof...(Indices) <
rank(),
361 "Too Many Arguments!");
365 std::to_string(idx) +
366 " out of range [0, " +
367 std::to_string(First) +
369 return base_type::operator[](idx)(rest...);
375 if (ma.begin() == ma.end())
377 auto it = ma.begin();
379 while (++it != ma.end())
387 T *
fbegin() {
return this->data()->fbegin(); }
390 const T *
fbegin()
const {
return this->data()->fbegin(); }
422 return {First, Rest...};
441 template <
class T,
size_t... Dims>
446 auto ai = a.fbegin();
447 auto bi = b.fbegin();
448 auto ci = c.fbegin();
449 while (ci != c.fend())
450 *ci++ = *ai++ + *bi++;
457 template <
class T,
size_t... Dims>
462 auto ai = a.fbegin();
463 auto bi = b.fbegin();
464 auto ci = c.fbegin();
465 while (ci != c.fend())
466 *ci++ = *ai++ - *bi++;
473 template <
class T,
size_t... Dims>
478 auto ai = a.fbegin();
479 auto bi = b.fbegin();
480 auto ci = c.fbegin();
481 while (ci != c.fend())
482 *ci++ = *ai++ * *bi++;
489 template <
class T,
size_t... Dims>
494 auto ai = a.fbegin();
495 auto bi = b.fbegin();
496 auto ci = c.fbegin();
497 while (ci != c.fend())
498 *ci++ = *ai++ / *bi++;
505 template <
class T,
size_t... Dims>
510 auto ai = a.fbegin();
511 auto bi = b.fbegin();
512 auto ci = c.fbegin();
513 while (ci != c.fend())
514 *ci++ = *ai++ % *bi++;
521 template <
class T,
size_t... Dims>
525 auto ai = a.fbegin();
526 auto bi = b.fbegin();
527 while (ai != a.fend())
535 template <
class T,
size_t... Dims>
539 auto ai = a.fbegin();
540 auto bi = b.fbegin();
541 while (ai != a.fend())
549 template <
class T,
size_t... Dims>
553 auto ai = a.fbegin();
554 auto bi = b.fbegin();
555 while (ai != a.fend())
563 template <
class T,
size_t... Dims>
567 auto ai = a.fbegin();
568 auto bi = b.fbegin();
569 while (ai != a.fend())
577 template <
class T,
size_t... Dims>
581 auto ai = a.fbegin();
582 auto bi = b.fbegin();
583 while (ai != a.fend())
591 template <
class T,
size_t... Dims>
596 auto ai = a.fbegin();
597 auto bi = b.fbegin();
598 auto ci = c.fbegin();
599 while (ci != c.fend())
600 *ci++ = *ai++ == *bi++;
607 template <
class T,
size_t... Dims>
612 auto ai = a.fbegin();
613 auto bi = b.fbegin();
614 auto ci = c.fbegin();
615 while (ci != c.fend())
616 *ci++ = *ai++ != *bi++;
623 template <
class T,
size_t... Dims>
624 MultiArray<bool, Dims...>
operator<(
const MultiArray<T, Dims...> &a,
625 const MultiArray<T, Dims...> &b)
627 MultiArray<bool, Dims...> c;
628 auto ai = a.fbegin();
629 auto bi = b.fbegin();
630 auto ci = c.fbegin();
631 while (ci != c.fend())
632 *ci++ = *ai++ < *bi++;
639 template <
class T,
size_t... Dims>
644 auto ai = a.fbegin();
645 auto bi = b.fbegin();
646 auto ci = c.fbegin();
647 while (ci != c.fend())
648 *ci++ = *ai++ > *bi++;
655 template <
class T,
size_t... Dims>
656 MultiArray<bool, Dims...>
operator<=(
const MultiArray<T, Dims...> &a,
657 const MultiArray<T, Dims...> &b)
659 MultiArray<bool, Dims...> c;
660 auto ai = a.fbegin();
661 auto bi = b.fbegin();
662 auto ci = c.fbegin();
663 while (ci != c.fend())
664 *ci++ = *ai++ <= *bi++;
671 template <
class T,
size_t... Dims>
676 auto ai = a.fbegin();
677 auto bi = b.fbegin();
678 auto ci = c.fbegin();
679 while (ci != c.fend())
680 *ci++ = *ai++ >= *bi++;
688 template <
class T,
size_t... Dims,
class U>
693 auto ai = a.fbegin();
694 auto bi = b.fbegin();
695 while (bi != b.fend())
696 *bi++ = *ai++ + value;
703 template <
class T,
size_t... Dims,
class U>
708 auto ai = a.fbegin();
709 auto bi = b.fbegin();
710 while (bi != b.fend())
711 *bi++ = *ai++ - value;
718 template <
class T,
size_t... Dims,
class U>
723 auto ai = a.fbegin();
724 auto bi = b.fbegin();
725 while (bi != b.fend())
726 *bi++ = *ai++ * value;
733 template <
class T,
size_t... Dims,
class U>
738 auto ai = a.fbegin();
739 auto bi = b.fbegin();
740 while (bi != b.fend())
741 *bi++ = *ai++ / value;
748 template <
class T,
size_t... Dims,
class U>
753 auto ai = a.fbegin();
754 auto bi = b.fbegin();
755 while (bi != b.fend())
756 *bi++ = *ai++ % value;
763 template <
class T,
size_t... Dims,
class U>
767 a.for_each([&](
T &ref)
775 template <
class T,
size_t... Dims,
class U>
779 a.for_each([&](
T &ref)
787 template <
class T,
size_t... Dims,
class U>
791 a.for_each([&](
T &ref)
799 template <
class T,
size_t... Dims,
class U>
803 a.for_each([&](
T &ref)
811 template <
class T,
size_t... Dims,
class U>
815 a.for_each([&](
T &ref)
824 template <
class T,
size_t... Dims,
class U>
834 template <
class T,
size_t... Dims,
class U>
839 auto ai = a.fbegin();
840 auto bi = b.fbegin();
841 while (bi != b.fend())
842 *bi++ = value - *ai++;
849 template <
class T,
size_t... Dims,
class U>
859 template <
class T,
size_t... Dims,
class U>
864 auto ai = a.fbegin();
865 auto bi = b.fbegin();
866 while (bi != b.fend())
867 *bi++ = value / *ai++;
874 template <
class T,
size_t... Dims,
class U>
879 auto ai = a.fbegin();
880 auto bi = b.fbegin();
881 while (bi != b.fend())
882 *bi++ = value % *ai++;
890 template <
class T,
size_t... Dims>
899 template <
class T,
size_t... Dims>
903 auto ai = a.fbegin();
904 auto bi = b.fbegin();
905 while (bi != b.fend())
913 template <
class T,
size_t... Dims>
917 auto ai = a.fbegin();
918 auto bi = b.fbegin();
919 while (bi != b.fend())
927 template <
class T,
size_t... Dims>
931 auto ai = a.fbegin();
932 auto bi = b.fbegin();
933 while (bi != b.fend())
942 template <
class T,
size_t... Dims,
class U>
947 auto ai = a.fbegin();
948 auto bi = b.fbegin();
949 while (bi != b.fend())
950 *bi++ = *ai++ == value;
957 template <
class T,
size_t... Dims,
class U>
962 auto ai = a.fbegin();
963 auto bi = b.fbegin();
964 while (bi != b.fend())
965 *bi++ = *ai++ != value;
972 template <
class T,
size_t... Dims,
class U>
973 MultiArray<bool, Dims...>
operator<(
const MultiArray<T, Dims...> &a,
976 MultiArray<bool, Dims...> b;
977 auto ai = a.fbegin();
978 auto bi = b.fbegin();
979 while (bi != b.fend())
980 *bi++ = *ai++ < value;
987 template <
class T,
size_t... Dims,
class U>
992 auto ai = a.fbegin();
993 auto bi = b.fbegin();
994 while (bi != b.fend())
995 *bi++ = *ai++ > value;
1002 template <
class T,
size_t... Dims,
class U>
1003 MultiArray<bool, Dims...>
operator<=(
const MultiArray<T, Dims...> &a,
1006 MultiArray<bool, Dims...> b;
1007 auto ai = a.fbegin();
1008 auto bi = b.fbegin();
1009 while (bi != b.fend())
1010 *bi++ = *ai++ <= value;
1017 template <
class T,
size_t... Dims,
class U>
1022 auto ai = a.fbegin();
1023 auto bi = b.fbegin();
1024 while (bi != b.fend())
1025 *bi++ = *ai++ >= value;
1033 template <
class T,
size_t... Dims,
class U>
1043 template <
class T,
size_t... Dims,
class U>
1053 template <
class T,
size_t... Dims,
class U>
1054 MultiArray<bool, Dims...>
operator<(
const U &value,
1055 const MultiArray<T, Dims...> &a)
1063 template <
class T,
size_t... Dims,
class U>
1073 template <
class T,
size_t... Dims,
class U>
1074 MultiArray<bool, Dims...>
operator<=(
const U &value,
1075 const MultiArray<T, Dims...> &a)
1083 template <
class T,
size_t... Dims,
class U>
1094 template <
class T,
size_t... Dims>
1099 auto ai = a.fbegin();
1100 auto bi = b.fbegin();
1101 auto ci = c.fbegin();
1102 while (ci != c.fend())
1103 *ci++ = *ai++ && *bi++;
1110 template <
class T,
size_t... Dims>
1115 auto ai = a.fbegin();
1116 auto bi = b.fbegin();
1117 auto ci = c.fbegin();
1118 while (ci != c.fend())
1119 *ci++ = *ai++ || *bi++;
1127 template <
class T,
size_t... Dims,
class U>
1132 auto ai = a.fbegin();
1133 auto bi = b.fbegin();
1134 while (bi != b.fend())
1135 *bi++ = *ai++ && value;
1142 template <
class T,
size_t... Dims,
class U>
1147 auto ai = a.fbegin();
1148 auto bi = b.fbegin();
1149 while (bi != b.fend())
1150 *bi++ = *ai++ || value;
1157 template <
class T,
size_t... Dims,
class U>
1167 template <
class T,
size_t... Dims,
class U>
1178 template <
class T,
size_t... Dims>
1183 auto ai = a.fbegin();
1184 auto bi = b.fbegin();
1185 auto ci = c.fbegin();
1186 while (ci != c.fend())
1187 *ci++ = *ai++ & *bi++;
1194 template <
class T,
size_t... Dims>
1199 auto ai = a.fbegin();
1200 auto bi = b.fbegin();
1201 auto ci = c.fbegin();
1202 while (ci != c.fend())
1203 *ci++ = *ai++ | *bi++;
1210 template <
class T,
size_t... Dims>
1215 auto ai = a.fbegin();
1216 auto bi = b.fbegin();
1217 auto ci = c.fbegin();
1218 while (ci != c.fend())
1219 *ci++ = *ai++ ^ *bi++;
1226 template <
class T,
size_t... Dims>
1227 MultiArray<
T, Dims...>
operator<<(
const MultiArray<T, Dims...> &a,
1228 const MultiArray<T, Dims...> &b)
1230 MultiArray<
T, Dims...> c;
1231 auto ai = a.fbegin();
1232 auto bi = b.fbegin();
1233 auto ci = c.fbegin();
1234 while (ci != c.fend())
1235 *ci++ = *ai++ << *bi++;
1242 template <
class T,
size_t... Dims>
1247 auto ai = a.fbegin();
1248 auto bi = b.fbegin();
1249 auto ci = c.fbegin();
1250 while (ci != c.fend())
1251 *ci++ = *ai++ >> *bi++;
1258 template <
class T,
size_t... Dims>
1262 auto ai = a.fbegin();
1263 auto bi = b.fbegin();
1264 while (ai != a.fend())
1272 template <
class T,
size_t... Dims>
1276 auto ai = a.fbegin();
1277 auto bi = b.fbegin();
1278 while (ai != a.fend())
1286 template <
class T,
size_t... Dims>
1290 auto ai = a.fbegin();
1291 auto bi = b.fbegin();
1292 while (ai != a.fend())
1300 template <
class T,
size_t... Dims>
1301 MultiArray<
T, Dims...> &
operator<<=(MultiArray<T, Dims...> &a,
1302 const MultiArray<T, Dims...> &b)
1304 auto ai = a.fbegin();
1305 auto bi = b.fbegin();
1306 while (ai != a.fend())
1314 template <
class T,
size_t... Dims>
1318 auto ai = a.fbegin();
1319 auto bi = b.fbegin();
1320 while (ai != a.fend())
1329 template <
class T,
size_t... Dims,
class U>
1334 auto ai = a.fbegin();
1335 auto bi = b.fbegin();
1336 while (bi != b.fend())
1337 *bi++ = *ai++ & value;
1344 template <
class T,
size_t... Dims,
class U>
1349 auto ai = a.fbegin();
1350 auto bi = b.fbegin();
1351 while (bi != b.fend())
1352 *bi++ = *ai++ | value;
1359 template <
class T,
size_t... Dims,
class U>
1364 auto ai = a.fbegin();
1365 auto bi = b.fbegin();
1366 while (bi != b.fend())
1367 *bi++ = *ai++ ^ value;
1374 template <
class T,
size_t... Dims,
class U>
1375 MultiArray<
T, Dims...>
operator<<(
const MultiArray<T, Dims...> &a,
1378 MultiArray<
T, Dims...> b;
1379 auto ai = a.fbegin();
1380 auto bi = b.fbegin();
1381 while (bi != b.fend())
1382 *bi++ = *ai++ << value;
1389 template <
class T,
size_t... Dims,
class U>
1394 auto ai = a.fbegin();
1395 auto bi = b.fbegin();
1396 while (bi != b.fend())
1397 *bi++ = *ai++ >> value;
1404 template <
class T,
size_t... Dims,
class U>
1414 template <
class T,
size_t... Dims,
class U>
1424 template <
class T,
size_t... Dims,
class U>
1434 template <
class T,
size_t... Dims,
class U>
1436 const MultiArray<T, Dims...> &a)
1438 MultiArray<
T, Dims...> b;
1439 auto ai = a.fbegin();
1440 auto bi = b.fbegin();
1441 while (bi != b.fend())
1442 *bi++ = value << *ai++;
1449 template <
class T,
size_t... Dims,
class U>
1454 auto ai = a.fbegin();
1455 auto bi = b.fbegin();
1456 while (bi != b.fend())
1457 *bi++ = value >> *ai++;
1464 template <
class T,
size_t... Dims,
class U>
1468 a.for_each([&](
T &ref)
1476 template <
class T,
size_t... Dims,
class U>
1480 a.for_each([&](
T &ref)
1488 template <
class T,
size_t... Dims,
class U>
1492 a.for_each([&](
T &ref)
1500 template <
class T,
size_t... Dims,
class U>
1501 MultiArray<
T, Dims...> &
operator<<=(MultiArray<T, Dims...> &a,
1504 a.for_each([&](
T &ref)
1505 { ref <<= value; });
1512 template <
class T,
size_t... Dims,
class U>
1516 a.for_each([&](
T &ref)
1517 { ref >>= value; });
1537 template <
class T,
size_t... Dims>
1541 a.for_each([&](
const T &ref)
1542 { result += ref; });
1550 template <
class T,
size_t... Dims>
1553 return *std::min_element(a.fbegin(), a.fend());
1560 template <
class T,
size_t... Dims>
1563 return *std::max_element(a.fbegin(), a.fend());
1570 template <
class T,
size_t... Dims>
1573 for (
auto it = a.fbegin(); it != a.fend(); ++it)
1583 template <
class T,
size_t... Dims>
1586 for (
auto it = a.fbegin(); it != a.fend(); ++it)
1610 template <
size_t... OutArrDims,
class VarType,
size_t... InArrDims>
1616 "Bad multiarray_cast: Mismatch Size");
1617 MultiArray<VarType, OutArrDims...> outputArr;
1618 std::copy(inputArr.fbegin(), inputArr.fend(), outputArr.fbegin());
1633 template <
class OutType,
size_t... OutArrDims,
1634 class InType,
size_t... InArrDims>
1638 MultiArray<OutType, OutArrDims...> outputArr;
1639 memcpy(&outputArr, &inputArr,
sizeof(outputArr));
1652 template <
size_t... OutArrDims,
class VarType,
size_t... InArrDims>
1658 "Bad inplace_multiarray_cast: Mismatch Size");
1659 auto p = (
MultiArray<VarType, OutArrDims...> *)&inputArr;
1672 template <
size_t... OutArrDims,
class VarType,
size_t... InArrDims>
1678 "Bad inplace_multiarray_cast: Mismatch Size");
1679 auto p = (
const MultiArray<VarType, OutArrDims...> *)&inputArr;
const T * fend() const
常量版本。
Definition multiarray.h:192
const T * fbegin() const
常量版本。
Definition multiarray.h:186
void for_each(F &&visit) const
遍历所有元素并应用函数(常量版本)。
Definition multiarray.h:129
MultiArray(const T &value)
用相同值填充所有元素。
Definition multiarray.h:81
reference operator()(size_t i)
带边界检查的下标访问(一维)。
Definition multiarray.h:141
friend std::ostream & operator<<(std::ostream &os, const MultiArray &ma)
输出 MultiArray 到流,格式为嵌套的方括号。
Definition multiarray.h:167
MultiArray()=default
默认构造,元素未初始化(基本类型为随机值)。
T & reference
Definition multiarray.h:71
const T & const_reference
Definition multiarray.h:72
T * fend()
返回指向扁平化数据末尾的指针(非常量)。
Definition multiarray.h:189
void fill(const T &value)
用给定值填充所有元素。
Definition multiarray.h:105
MultiArray(const base_type &other)
从 std::array 拷贝构造。
Definition multiarray.h:87
const_reference operator()(size_t i) const
常量版本。
Definition multiarray.h:154
T * fbegin()
返回指向扁平化数据起始的指针(非常量)。
Definition multiarray.h:183
MultiArray(std::initializer_list< T > init)
从初始化列表构造(仅一维)。
Definition multiarray.h:93
static constexpr std::array< size_t, 1 > dims()
返回包含维度信息的数组。
Definition multiarray.h:216
static constexpr size_t rank()
返回数组的维数(一维时为 1)。
Definition multiarray.h:99
void for_each(F &&visit)
遍历所有元素并应用函数(非常量版本)。
Definition multiarray.h:117
static constexpr size_t fsize()
返回元素总数。
Definition multiarray.h:102
const MultiArray & flatten() const
扁平化视图(常量)。
Definition multiarray.h:207
T value_type
Definition multiarray.h:70
MultiArray & flatten()
扁平化视图(可变)。
Definition multiarray.h:198
auto operator()(size_t idx, Indices... rest) const -> decltype(base_type::operator[](idx)(rest...))
常量版本。
Definition multiarray.h:357
reference operator()(size_t idx)
单下标访问,返回子数组引用。
Definition multiarray.h:307
void for_each(F &&visit) const
遍历所有元素(常量版本)。
Definition multiarray.h:295
const MultiArray< T, Rest... > & const_reference
Definition multiarray.h:237
const MultiArray< T, fsize()> & flatten() const
扁平化视图(常量)。
Definition multiarray.h:411
MultiArray< T, Rest... > & reference
Definition multiarray.h:236
const T * fend() const
常量版本。
Definition multiarray.h:396
void for_each(F &&visit)
遍历所有元素(非常量版本)。
Definition multiarray.h:284
MultiArray(std::initializer_list< MultiArray< T, Rest... > > init)
从初始化列表构造(多维)。
Definition multiarray.h:258
const T * fbegin() const
常量版本。
Definition multiarray.h:390
friend std::ostream & operator<<(std::ostream &os, const MultiArray &ma)
输出 MultiArray 到流,递归输出嵌套方括号。
Definition multiarray.h:373
MultiArray< T, fsize()> & flatten()
扁平化视图(可变)。
Definition multiarray.h:402
static constexpr size_t fsize()
返回元素总数。
Definition multiarray.h:267
MultiArray()=default
默认构造。
T * fbegin()
扁平化起始迭代器(非常量)。
Definition multiarray.h:387
void fill(const T &value)
递归填充所有元素。
Definition multiarray.h:273
auto operator()(size_t idx, Indices... rest) -> decltype(base_type::operator[](idx)(rest...))
多维下标访问。
Definition multiarray.h:340
T * fend()
扁平化结束迭代器(非常量)。
Definition multiarray.h:393
const_reference operator()(size_t idx) const
常量版本。
Definition multiarray.h:320
static constexpr size_t rank()
返回数组维数。
Definition multiarray.h:264
static constexpr std::array< size_t, rank()> dims()
返回包含维度信息的数组。
Definition multiarray.h:420
MultiArray(const T &value)
用相同值递归填充所有元素。
Definition multiarray.h:246
T value_type
Definition multiarray.h:235
MultiArray(const base_type &other)
从 std::array 拷贝构造。
Definition multiarray.h:252
编译期固定维度的多维数组。
Definition multiarray.h:57
表示 MultiArray 多维数组操作中的错误,如维度不匹配。
Definition csexc.h:120
定义 console 库使用的自定义异常类层次结构。
MultiArray< VarType, OutArrDims... > multiarray_cast(const MultiArray< VarType, InArrDims... > &inputArr)
改变 MultiArray 的维度形状(元素类型不变),要求总元素数相同。
Definition multiarray.h:1611
MultiArray< OutType, OutArrDims... > unsafe_multiarray_cast(const MultiArray< InType, InArrDims... > &inputArr)
不安全地改变 MultiArray 的元素类型和维度(内存拷贝)。
Definition multiarray.h:1635
MultiArray< VarType, OutArrDims... > & inplace_multiarray_cast(MultiArray< VarType, InArrDims... > &inputArr)
就地版本的 multiarray_cast,仅视图,不拷贝(可变版本)
Definition multiarray.h:1653
MultiArray< T, Dims... > operator<<(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
左移(数组 << 数组)。
Definition multiarray.h:1227
MultiArray< bool, Dims... > operator>=(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素大于等于比较(数组 >= 数组)。
Definition multiarray.h:672
MultiArray< T, Dims... > & operator*=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素乘法赋值(数组 *= 数组)。
Definition multiarray.h:550
MultiArray< bool, Dims... > operator<=(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素小于等于比较(数组 <= 数组)。
Definition multiarray.h:656
MultiArray< T, Dims... > & operator%=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素取模赋值(数组 %= 数组)。
Definition multiarray.h:578
MultiArray< bool, Dims... > operator!=(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素不等比较(数组 != 数组)。
Definition multiarray.h:608
MultiArray< T, Dims... > & operator/=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素除法赋值(数组 /= 数组)。
Definition multiarray.h:564
MultiArray< T, Dims... > & operator+=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素加法赋值(数组 += 数组)。
Definition multiarray.h:522
MultiArray< bool, Dims... > operator==(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素相等比较(数组 == 数组),返回 bool 数组。
Definition multiarray.h:592
MultiArray< T, Dims... > & operator<<=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
左移赋值(数组 <<= 数组)。
Definition multiarray.h:1301
MultiArray< T, Dims... > operator>>(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
右移(数组 >> 数组)。
Definition multiarray.h:1243
MultiArray< T, Dims... > operator+(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素加法(数组 + 数组)。
Definition multiarray.h:442
MultiArray< T, Dims... > operator^(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
按位异或(数组 ^ 数组)。
Definition multiarray.h:1211
MultiArray< bool, Dims... > operator!(const MultiArray< T, Dims... > &a)
逻辑非(数组),返回 bool 数组。
Definition multiarray.h:914
MultiArray< T, Dims... > operator*(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素乘法(数组 * 数组)。
Definition multiarray.h:474
MultiArray< T, Dims... > & operator&=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
按位与赋值(数组 &= 数组)。
Definition multiarray.h:1259
MultiArray< T, Dims... > operator/(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素除法(数组 / 数组)。
Definition multiarray.h:490
MultiArray< T, Dims... > & operator>>=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
右移赋值(数组 >>= 数组)。
Definition multiarray.h:1315
MultiArray< bool, Dims... > operator||(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
逻辑或(数组 || 数组)。
Definition multiarray.h:1111
MultiArray< T, Dims... > & operator-=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素减法赋值(数组 -= 数组)。
Definition multiarray.h:536
MultiArray< T, Dims... > & operator^=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
按位异或赋值(数组 ^= 数组)。
Definition multiarray.h:1287
MultiArray< T, Dims... > operator&(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
按位与(数组 & 数组)。
Definition multiarray.h:1179
MultiArray< bool, Dims... > operator&&(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
逻辑与(数组 && 数组),返回 bool 数组。
Definition multiarray.h:1095
MultiArray< T, Dims... > operator-(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素减法(数组 - 数组)。
Definition multiarray.h:458
MultiArray< T, Dims... > & operator|=(MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
按位或赋值(数组 |= 数组)。
Definition multiarray.h:1273
MultiArray< T, Dims... > operator~(const MultiArray< T, Dims... > &a)
按位取反(数组)。
Definition multiarray.h:928
MultiArray< bool, Dims... > operator<(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素小于比较(数组 < 数组)。
Definition multiarray.h:624
MultiArray< bool, Dims... > operator>(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素大于比较(数组 > 数组)。
Definition multiarray.h:640
MultiArray< T, Dims... > operator|(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
按位或(数组 | 数组)。
Definition multiarray.h:1195
MultiArray< T, Dims... > operator%(const MultiArray< T, Dims... > &a, const MultiArray< T, Dims... > &b)
元素取模(数组 % 数组)。
Definition multiarray.h:506
bool all(const MultiArray< T, Dims... > &a)
检查所有元素是否都为 true(逻辑与归约)。
Definition multiarray.h:1571
T min(const MultiArray< T, Dims... > &a)
求最小值。
Definition multiarray.h:1551
bool any(const MultiArray< T, Dims... > &a)
检查是否存在至少一个 true 元素(逻辑或归约)。
Definition multiarray.h:1584
T max(const MultiArray< T, Dims... > &a)
求最大值。
Definition multiarray.h:1561
T sum(const MultiArray< T, Dims... > &a)
求和所有元素。
Definition multiarray.h:1538
enable_if_string< T > repr(T &&value, std::ostream &os=std::cout)
输出字符串类型(std::string, const char* 等)的表示,带双引号。
Definition repr.h:79
提供类似 Python 的 repr() 函数,用于生成对象的可读字符串表示。