Просто используя одномерный массив, вы должны сэкономить место, и время доступа может немного измениться, хотя, будет ли оно быстрее или нет, это, вероятно, зависит от компилятора и языка.
Я быстро написал это решение в Qt, но должно быть просто преобразовать его в stl c ++ или другой язык:
#include <QVector>
#include <QDebug>
#include <QString>
class MirroredArray
{
public:
MirroredArray(int sideLength)
{
values.fill(0, sideLength*(sideLength+1)/2);
this->s = sideLength;
}
int get(int r, int c)
{
if(c > r)
{
return values.at(s*r-(r-1)*r/2 + c-r);
}
else
{
return values.at(s*c-(c-1)*c/2 + r-c);
}
}
void set(int r, int c, int value)
{
if(c > r)
{
values[s*r-(r-1)*r/2 + c-r] = value;
}
else
{
values[s*c-(c-1)*c/2 + r-c] = value;
}
}
int getSide()
{
return s;
}
QString contentsToString()
{
QString temp = "(" + QString::number(values.size()) + ") - ";
for(int i = 0; i<values.size(); i++)
temp += QString::number(i) + ", ";
return temp;
}
private:
QVector <int> values;
int s;
};
Примечание: этот код не выполняет никакой проверки ошибок, которую вы передаете вдопустимое значение строки и столбца.