Если вы используете что-то, поддерживающее перегрузку операторов (например, C ++), это довольно просто сделать прозрачно.Просто создайте матричный класс, который проверяет две подписки, и, если вторая больше первой, поменяйте их местами:
template <class T>
class sym_matrix {
std::vector<std::vector<T> > data;
public:
T operator()(int x, int y) {
if (y>x)
return data[y][x];
else
return data[x][y];
}
};
На данный момент я пропустил все остальное и просто охватил подписку.В действительности, чтобы правильно обрабатывать использование как lvalue и rvalue, вам, как правило, нужно возвращать прокси вместо T напрямую.Вам понадобится ctor, который создает data
в виде треугольника (т. Е. Для матрицы NxN первая строка будет иметь N элементов, вторая N-1 и т. Д. - или, эквивалентно, 1, 2, ...N).Вы можете также рассмотреть возможность создания data
как одного vector
- вам нужно вычислить правильное смещение в нем, но это не очень сложно, и оно будет использовать немного меньше памяти, работать немного быстрее и т. Д.Использовать простой код для первой версии и оптимизировать позже, если необходимо.