10#include "da_hash_table.hpp"
11#include "da_vector_table.hpp"
30 using IndexPair = std::pair< IndexType, IndexType >;
46 bool contain(
int r,
int c)
const;
48 const T&
at(
int r,
int c)
const;
52 T
cell(
int r,
int c)
const;
65 std::size_t
size()
const;
87 template<
typename OtherType >
93 template<
typename OtherType >
104 std::size_t erase_if__(
PredFun pred);
123template<
typename T >
139template<
typename T >
143 mShape = other.mShape;
161template<
typename T >
164 mData = std::move(other.mData);
165 mShape = std::move(other.mShape);
181template<
typename T >
185 mShape = other.mShape;
202template<
typename T >
205 mData = std::move(other.mData);
206 mShape = std::move(other.mShape);
224template<
typename T >
227 return (mData.cend() != mData.find(r, c));
243template<
typename T >
246 return (mData.cend() != mData.find(i));
262template<
typename T >
287template<
typename T >
290 return mData.at(r, c);
313template<
typename T >
316 return mData.at(r, c);
337template<
typename T >
362template<
typename T >
382template<
typename T >
385 return mData.value(r, c);
401template<
typename T >
404 return mData.value(i);
419template<
typename T >
440template<
typename T >
443 reflashShape(std::make_pair(r, c));
454template<
typename T >
471template<
typename T >
490template<
typename T >
507template<
typename T >
524template<
typename T >
527 return mShape.second;
541template<
typename T >
557template<
typename T >
560 mShape = mData.shape();
575template<
typename T >
595template<
typename T >
598 auto i = mData.find(r, c);
599 if (i != mData.end()) {
602 if (r == (mShape.first - 1) || c == (mShape.second - 1)) {
624template<
typename T >
627 return removeCell(i.first, i.second);
641template<
typename T >
663template<
typename T >
680template<
typename T >
701template<
typename T >
704 return mData.
find(i);
723template<
typename T >
744template<
typename T >
747 return mData.find(i.first, i.second);
766template<
typename T >
784template<
typename T >
802template<
typename T >
820template<
typename T >
823 return mData.begin();
838template<
typename T >
841 return mData.begin();
856template<
typename T >
859 return mData.empty();
877template<
typename T >
880 std::size_t r = erase_if__(pred);
899template<
typename T >
904 std::vector< value_type > temp;
905 std::ignore = erase_if__([ col, &temp ](
const value_type& v) ->
bool {
906 if (v.first.second == col) {
908 }
else if (v.first.second > col) {
910 temp.emplace_back(v);
916 std::for_each(temp.begin(), temp.end(), [
this ](
value_type& v) {
917 IndexPair k = v.first;
919 mData[ k ] = v.second;
939template<
typename T >
940template<
typename OtherType >
944 for (
auto i = mData.cbegin(), last = mData.cend(); i != last; ++i) {
945 other[ i->first ] = trFun(i->second);
969template<
typename T >
972 auto rowCnt = rowCount();
973 for (
auto r = 0; r < rowCnt; ++r) {
974 auto ite = mData.find(
IndexPair(r, col));
975 if (ite != mData.end()) {
976 if (!trFun(ite->second)) {
996template<
typename T >
997template<
typename OtherType >
1003 for (
auto r = 0; r < rc; ++r) {
1004 for (
auto c = 0; c < cc; ++c) {
1005 set(r, c, other(r, c));
1020template<
typename T >
1023 if (k.first >= mShape.first) {
1024 mShape.first = k.first + 1;
1026 if (k.second >= mShape.second) {
1027 mShape.second = k.second + 1;
1041template<
typename T >
1042std::size_t DATable< T >::erase_if__(PredFun pred)
1044 auto old_size = size();
1045 for (
auto i = mData.begin(), last = mData.end(); i != last;) {
1052 return old_size - size();
1072template<
typename T1,
typename T2 >
1073da_vector_table< T1 >
table_transfered(
const DATable< T2 >& table, std::function< T1(
const T2&) > tr_fun)
1075 da_vector_table< T1 > res;
1077 res.resize(sh.first, sh.second);
1078 for (
auto c = table.begin(); c != table.end(); ++c) {
1079 res(c->first.first, c->first.second) = tr_fun(c->second);
1083template<
typename T1,
typename T2 >
1086 da_vector_table< T1 > res;
1088 res.resize(sh.first, sh.second);
1089 for (
auto c = table.begin(); c != table.end(); ++c) {
1090 res(c->first.first, c->first.second) = c->second;
1108template<
typename T1,
typename T2 >
1114 for (std::size_t r = 0; r < rc; ++r) {
1115 for (std::size_t c = 0; c < cc; ++c) {
1116 res.
set(r, c, tr_fun(table(r, c)));
支持稀疏存储和各种算法的表格类
Definition DATable.hpp:26
std::pair< IndexType, IndexType > IndexPair
索引对类型
Definition DATable.hpp:30
DATable< OtherType > transfered(std::function< OtherType(const T &v) > trFun) const
转换表格数据类型
Definition DATable.hpp:941
void clear()
清空表格
Definition DATable.hpp:642
int columnCount() const
获取表格列数
Definition DATable.hpp:525
int rowCount() const
获取表格行数
Definition DATable.hpp:508
bool empty() const
检查表格是否为空
Definition DATable.hpp:857
std::size_t size() const
获取表格元素数量
Definition DATable.hpp:576
typename TableType::iterator TableIterator
表格迭代器
Definition DATable.hpp:32
T & operator()(IndexType r, IndexType c)
函数调用运算符访问元素
Definition DATable.hpp:441
bool contain(int r, int c) const
检查单元格是否有内容
Definition DATable.hpp:225
void recalcShape()
重新计算表格形状
Definition DATable.hpp:558
T Type
值类型
Definition DATable.hpp:28
std::function< bool(const value_type &) > PredFun
谓词函数类型
Definition DATable.hpp:35
int IndexType
索引类型
Definition DATable.hpp:29
void dropColumn(IndexType col)
移除指定列
Definition DATable.hpp:900
const T & at(int r, int c) const
带边界检查的元素访问
Definition DATable.hpp:288
TableConstIterator end() const
返回末尾迭代器
Definition DATable.hpp:785
void set(const IndexPair &k, const T &v)
设置单元格值
Definition DATable.hpp:472
TableConstIterator begin() const
返回起始迭代器
Definition DATable.hpp:821
TableConstIterator find(const IndexPair &i) const
查找元素
Definition DATable.hpp:702
typename TableType::value_type value_type
兼容std的值类型
Definition DATable.hpp:34
IndexPair shape() const
获取表格形状
Definition DATable.hpp:542
DATable< T > & operator=(const DATable &other)
拷贝赋值运算符
Definition DATable.hpp:182
TableType & rawData()
获取内部表格数据
Definition DATable.hpp:664
T cell(int r, int c) const
安全的元素访问,返回默认值如果不存在
Definition DATable.hpp:383
DATable()
默认构造函数
Definition DATable.hpp:124
IndexPair getShape() const
获取表格形状
Definition DATable.hpp:263
void transferColumn(IndexType col, std::function< bool(const T &v) > trFun) const
遍历指定列
Definition DATable.hpp:970
T & operator[](const IndexPair &i)
下标运算符访问元素
Definition DATable.hpp:420
std::size_t erase_if(PredFun pred)
按条件删除元素
Definition DATable.hpp:878
bool removeCell(int r, int c)
移除指定单元格
Definition DATable.hpp:596
typename TableType::const_iterator TableConstIterator
表格常量迭代器
Definition DATable.hpp:33
iterator find(key_type k)
查找元素
Definition da_hash_table.hpp:651
二维表格数据结构,使用一维数组存储以提高缓存友好性
Definition da_vector_table.hpp:22
std::size_t column_count() const noexcept
获取表格的列数
Definition da_vector_table.hpp:1512
std::size_t row_count() const noexcept
获取表格的行数
Definition da_vector_table.hpp:1495
序列化类都是带异常的,使用中需要处理异常
Definition AppMainWindow.cpp:44
DATable< T1 > table_transfered(const da_vector_table< T2 > &table, std::function< T1(const T2 &) > tr_fun)
实现DATable向da_vector_table的转换
Definition DATable.hpp:1109