Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++加速地图访问_C++_Performance - Fatal编程技术网

C++加速地图访问

C++加速地图访问,c++,performance,C++,Performance,我定义了以下地图: class xy_angle { public: int x; int y; int angle; xy_angle(int x, int y, int angle) :x(x), y(y), angle(angle){}; }; class xy_angleComparator { public: bool operator () (const xy_angle &a, const xy_angle &b) co

我定义了以下地图:

class xy_angle {
public:
    int x;
    int y;
    int angle;

    xy_angle(int x, int y, int angle) :x(x), y(y), angle(angle){};

};

class xy_angleComparator {
public:
    bool operator () (const xy_angle &a, const xy_angle &b) const {
        if (a.x != b.x)
            return a.x < b.x;
        else if (a.y != b.y)
            return a.y < b.y;
        else if (a.angle != b.angle)
            return a.angle < b.angle;
        else
            return false;
    }
};

std::map<xy_angle, std::pair<int, int>, xy_angleComparator> transformed_coordinates_lut_;
我用一大组随机键测量了地图的访问运行时间,这太疯狂了。它完全控制着使用它的函数的运行时间

有没有办法加快速度

谢谢


吉尔

您可以使用三维阵列:f[x_start][y_start][angle]。它将占用相同或更少的空间,因为您无论如何都有所有可能的密钥。当然,您也可以使用适当的索引模拟具有平面向量的三维阵列。这种方法保证了查找时间的恒定。

无论使用哪个容器,此代码都是错误的:

int ax2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].first;
int ay2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].second;
你在做两次相同的查找!明确缓存结果:

auto& a2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)];
int ax2 = a2.first;
int ay2 = a2.second;
现在就加快工作而言。最简单的前期工作就是细分出不同的关联容器类型:

using MapType = std::unordered_map<xy_angle,
                                   std::pair<int, int>,
                                   xy_angle_hash>; // implement this hash

Map的速度很慢,因为AFAIK经常将其实现为二叉树。无序的地图应该更快。如果你真的需要速度,你可以考虑一个排序向量。IIRC几个STL容器的效率有所提高。您可以尝试使用std::Unorered_映射来获得更好的搜索性能。您是说ax2和ay2的分配需要很长时间,还是创建LUT?此外,可以通过同时指定x_transformed和y_transformed来简化if语句。此外,如果不考虑设计中的顺序,无序映射的访问速度更快。并且确保在测量性能时不使用调试构建。即使是std::vector的操作符[]也会显得非常慢。谢谢你的帮助!
auto& a2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)];
int ax2 = a2.first;
int ay2 = a2.second;
using MapType = std::unordered_map<xy_angle,
                                   std::pair<int, int>,
                                   xy_angle_hash>; // implement this hash
class TransformMap
{
public:
    std::pair<int, int>& operator()(const xy_angle& );

private:
    // is it std::map?
    // or std::unordered_map?
    // or 3D-array or vector or ... ?
};