【问题标题】:How to improve a structure storing many results?如何改进存储许多结果的结构?
【发布时间】:2013-04-10 12:06:27
【问题描述】:

我有一个Polygon 结构和一个具有以下签名的函数

Polygon myfunction(Polygon &pol1, Polygon &pol2, int rot1, int rot2); 

其中 pol1 和 pol2 是Polygons,rot1 和 rot2 是对 pol1 和 pol2 应用的旋转。

我需要存储myfunction 应用于一组多边形和一组允许旋转的所有结果。

因此,例如,如果我有 100 个多边形和 4 个允许旋转,我需要存储 100*100*4*4 = 160000 个多边形。我知道我需要大量内存,但我可以接受。

目前我将它们存储在这样的容器中:

vector<vector<vector<vector<Polygon>> results;

所以调用 results[pol1][pol2][rot1][rot2]; 我得到正确的多边形。

我知道访问单个结果可能效率很低,那么我该如何改进呢?

【问题讨论】:

    标签: c++ c++11 polygons


    【解决方案1】:

    这取决于很多事情,我的解决方案是混合std::tuplestd::map

    typedef std::tuple<Polygon , Polygon , int, int> Params;
    
    std::map<Params, Polygon> results;
    

    将参数映射到结果。在这种情况下,您可以有效地找到特定输入的结果。

    要使用,您必须为Polygon 重载operator&lt;,因为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));
    

    【讨论】:

    • 由于只有 4 次旋转,我会说最好不要将它们作为映射键,而是作为索引。例如,对于两个旋转的每个组合,可能有一个地图,使用一对多边形作为键。
    • @Zyx2000 感谢您的建议,但 4 只是一个示例。可能会有更多轮换。
    • @888 即使有更多的旋转,只要你一直使用它们,将它们作为索引是合适的。
    猜你喜欢
    • 2019-09-19
    • 2012-11-25
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多