у меня есть Polygon
структура и функция со следующей подписью
Polygon myfunction(Polygon &pol1, Polygon &pol2, int rot1, int rot2);
в котором pol1 и pol2 Polygon
s, rot1 и rot2 — вращение, применяемое к pol1 и pol2.
Мне нужно хранить все результаты myfunction
применяется к набору многоугольников и множеству допустимых поворотов.
Так, например, если у меня 100 полигонов и 4 допустимых поворота, мне нужно хранить 100 * 100 * 4 * 4 = 160000 полигонов. Я знаю, что мне нужно много памяти, но я в порядке с этим.
На данный момент я храню их в таком контейнере:
vector<vector<vector<vector<Polygon>> results;
так что зовет results[pol1][pol2][rot1][rot2];
Я получил правильный многоугольник.
Я знаю, что доступ к одному результату может быть довольно неэффективным, так как я могу улучшить его?
Это зависит от многих вещей, мое решение смешивается std::tuple
а также std::map
typedef std::tuple<Polygon , Polygon , int, int> Params;
std::map<Params, Polygon> results;
Который сопоставляет параметры с результатами. В этом случае вы можете эффективно найти результат конкретного ввода.
Чтобы использовать, вы должны перегрузить operator<
за Polygon
потому что std::map
:
struct Polygon
{
// ...
};
inline bool operator<(const Polygon &p1, const Polygon &p2)
{
return ...;
}
Polygon p1, p2, p3;
// ...
results.insert(std::make_pair(std::make_tuple(p1, p2, 1, 2), p3));
Других решений пока нет …