繁体   English   中英

优化向量emplace_back

[英]Optimize vector emplace_back

我们必须找到一个圆中的所有点并将其保存在一个向量中以进行平面拟合。 我们为此编写了以下代码。 圆圈中的点数约为 2960520。执行时,执行vec.emplace_back(t)大约需要 300 毫秒。 有没有办法优化代码?

constexpr int radius = 971;
auto time_begin = chrono::high_resolution_clock::now();
int rSquare = radius * radius;
vector<Point_t> vec;
vec.reserve(2048 * 2048);
for (int i = 1024 - radius; i < 1024 + radius; ++i)
{
    int iSquare = (i - 1024) * (i - 1024);
    for (int j = 1024 - radius; j < 1024 + radius; ++j)
    {
        int y = j - 1024;
        if ((y * y + iSquare) <= rSquare)
        {
            Point_t t{ static_cast<double>(i),static_cast<double>(j) };
            vec.emplace_back(t);
        }
    }
}

auto time_end = chrono::high_resolution_clock::now();

结构声明

struct Point_t
{
    double dX;
    double dY;
};

我建议你重新考虑算法。 您当前测试该区域中的所有点。 相反,您可以只使用毕达哥拉斯定理来计算每条线的起点和终点。 如果你做对了,你实际上只需要计算四分之一的圆。

虽然这需要使用平方根,但我认为执行 sqrt 'radius' 次数很可能比测试(2*radius)^2点快得多。

对不起,没有代码。 目前无权访问 C++ 编译器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM