C++ 优化向量布设

C++ 优化向量布设,c++,optimization,stl,c++17,C++,Optimization,Stl,C++17,我们必须找到一个圆中的所有点,并将其保持在一个向量中,以便进行平面拟合。我们已经为此编写了以下代码。圆圈中的点数约为2960520。执行时,执行vec.emplace\u back(t)大约需要300毫秒。有没有办法优化代码 constexpr int radius = 971; auto time_begin = chrono::high_resolution_clock::now(); int rSquare = radius * radius; vector<Point_t>

我们必须找到一个圆中的所有点,并将其保持在一个向量中,以便进行平面拟合。我们已经为此编写了以下代码。圆圈中的点数约为2960520。执行时,执行
vec.emplace\u 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();

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

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


对不起,没有密码。暂时没有访问C++编译器。

尽量避免创建临时<代码> PooToTyt< /Cord>对象。即
vec.emplace_-back(静态施法(I)、静态施法(j))
这就是为什么
emplace_back()
函数是用于的。@TedLyngmo是的,你是对的,我刚刚错过了
保留
行。@Sprite即使没有
保留
我打赌在这种情况下
向量
列表
快。它不会像
列表
那样进行2960520次动态分配。@TedLyngmo我明白了,谢谢。
emplace\u back
是唯一可以观察到的效果,没有它编译器可能会完全优化循环。通过完全避免昂贵的数学操作,甚至可以使它更快:。还有,关于这一点,我先用了bresenhans algo。有几个重复点。移除它们代价高昂
struct Point_t
{
    double dX;
    double dY;
};