T
@DocShoe sagte in Fehlermeldung ab bestimmter Arraygröße:
Hab vor einiger Zeit mal nen Thread zu 2D Arrays aufgemacht, vllt hilft dir das.
2D Array
Ja daran erinnere mich auch. Bin daran ein data_table mit std::variant zu implementieren, darum wird dafür C++17 benötigt. Die Version die ich brauche ist spezialisierter als das untere Beispiel. Es fehlen auch noch Methoden um die Spalten- und Reihenanzahl dynamisch verändern zu können.
Auch die Beispielversion ist etwas spezialisiert, da sie nur für bestimmte Typen implementiert ist, aber es dürfte aber wenig Aufwand kosten, es für mehr oder/und andere Typen zu implementieren.
#include <vector>
#include <string>
#include <stringstream>
#include <variant>
#include <type_traits>
template<typename Ty>
struct VisitDataTable
{
template<typename = typename std::enable_if<!std::is_same<Ty, double>::value>::type>
double operator()(const double& variable) const
{
return variable;
}
Ty operator()(const Ty& variable) const
{
return variable;
}
std::string operator()(const std::string& variable) const
{
return variable;
}
};
template<typename Ty>
class DataTable
{
public:
// Avoids double type duplicate
// for variant template argument
using U = typename std::conditional<
std::is_same<Ty, double>::value,
std::variant<Ty, std::string>,
std::variant<Ty, double, std::string>
>::type;
DataTable() :
number_columns(0),
number_rows(0),
{}
void SetSize(size_t number_columns, size_t number_rows)
{
this->number_columns = number_columns;
this->number_rows = number_rows;
data.resize(number_columns * number_rows);
}
U& GetVariantRef(size_t column, size_t row)
{
return data[row * number_columns + column];
}
const U& GetVariantRef(size_t column, size_t row) const
{
return data[row * number_columns + column];
}
std::string GetString(size_t column, size_t row) const
{
std::stringstream stream;
auto variant = GetVariantRef(column, row);
std::visit([&stream](auto& variable)
{
stream << variable;
}, variant);
return stream.str();
}
size_t GetColumnByName(const std::string& name) const
{
size_t column = 0;
for (size_t index = 0; index < number_columns; ++index)
{
if (std::get<std::string>(data[index]) == name)
{
column = index;
}
}
return column;
}
std::vector<Ty> GetColumnData(const std::string& name) const
{
size_t column = GetColumnByName(name);
std::vector<Ty> column_data(GetNumberRows());
for (size_t index = 0; index < GetNumberRows(); ++index)
{
column_data[index] = std::get<Ty>(GetVariantRef(column, index));
}
return column_data;
}
size_t GetNumberRows() const
{
return number_rows;
}
size_t GetNumberColumns() const
{
return number_columns;
}
private:
size_t number_columns;
size_t number_rows;
std::vector<U> data;
};