如何使用std :: vector防止内存重新分配

Aso*_*ife 1 c++ pointers smart-pointers vector c++11

我已经阅读了很多问题,但没有人回答我的具体情况.

其实我有

std::vector<Point2Dd> points;
std::vector<Triangle> triangles;
Run Code Online (Sandbox Code Playgroud)

Point2Dd 是一个2D点的类,指定它的实现方式并不重要.

然而三角实现如下:

class Triangle{
    public:
     Triangle();
     Triangle(Point2Dd* p1, Point2Dd* p2, Point2Dd* p3);
     // Getter & setter

    private:
     Point2Dd* vA = nullptr;
     Point2Dd* vB = nullptr;
     Point2Dd* vC = nullptr;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,作为点向量的三点.

实际上它工作得很好,但我想:如果我在向量中添加另一个点,我的向量会更改所有内存地址吗?我的所有三角形都将由无效地址组成.

我读过关于使用的内容,std::unique_ptr<Point2Dd>但我认为这不是最好的方法.

你有什么解决方案吗?谢谢 :)

---编辑1 ---

为了澄清我的问题,我解释了我想要解决的问题.我正在做一个增量的Delaunay三角测量(没问题).所以我必须每次添加一次并更新我的三角测量.

所以我认为将三角形作为指向我的点的三个指针.我还有一个dag(节点 - >三个孩子的三角形)和一个保存相邻三角形的结构.

这就是为什么我认为总是使用指针,所以我不必在三个不同的结构中复制相同的点.

这就是我需要解决此问题以防止内存重新分配的原因.

Ric*_*ges 6

是的,因为在此之后我有一个非常繁重的算法,所以我需要尽可能地优化所有...

在这种情况下,请从数据副本开始.

struct Triangle{
     Triangle();
     Triangle(Point2Dd p1, Point2Dd p2, Point2Dd p3);
     // Getter & setter

    private:
     Point2Dd vA, vB, vC;
};
Run Code Online (Sandbox Code Playgroud)

虽然测量是唯一可以确定的方法,但基于指针的解决方案中固有的缓存局部性和间接内存访问的丢失几乎肯定会导致运行时间慢一个数量级.

  • @AsoStrife再次强调:你根本没有正确理解优化.以下是你应该为初学者做的事情:首先写出正确性和清晰度,然后测试它是否足够快.如果不是,请使用分析器找到当前的瓶颈,并优化这些瓶颈,直到程序运行得足够快.对性能进行随机猜测肯定会导致您使用缓慢且不正确或至少无法维护的代码. (4认同)
  • @AsoStrife复制double并不比复制指针慢 (3认同)
  • @AsoStrife制作1份副本远比间接100万次快... (2认同)