C++ 在标准向量中存储对象的正确方法

C++ 在标准向量中存储对象的正确方法,c++,pointers,vector,reference,new-operator,C++,Pointers,Vector,Reference,New Operator,让我一点一点地解释我的问题 这是一个2D游戏 我有简单的课程 第一个是Point类: class Point { public: double x; double y; Point(double x, double y) { this->x = x; this->y = y; }; }; 第二个是表示边的类: class Edge { public: Point startPoint; Poi

让我一点一点地解释我的问题

这是一个2D游戏

我有简单的课程

第一个是Point类:

class Point {
public:
    double x;
    double y;

    Point(double x, double y)
    {
        this->x = x;
        this->y = y;
    };
};
第二个是表示边的类:

class Edge {
public:
    Point startPoint;
    Point endPoint;

    Edge(Point startPoint, Point endPoint)
    {
        this->startPoint = startPoint;
        this->endPoint = endPoint;
    };
};
然后是一个指示角度点的类:

class AnglePoint {
public:
    Point point;
    Edge prevEdge;
    Edge nextEdge;

    AnglePoint(Point point,
               Edge prevEdge,
               Edge nextEdge)
    {
        this->point = point;
        this->prevEdge = prevEdge;
        this->nextEdge = nextEdge;
    };
};
然后我有一个std::vector来存储我生成的边对象:

std::vector<std::vector<Edge>> polyEdgeArray;
我有另一个向量来保存所有的角点对象:

std::vector<AnglePoint> anglePointArray;
然后,这是我游戏的背景,
polyEdgeArray
anglePointArray
的数量将相当大,比如100000

并且,
polyEdgeArray
anglePointArray
将每帧重新生成/重新计算


上面的代码在我的游戏中运行良好,但我不确定它们是否足够有效

根据上述信息,我有几个问题:

a。对于类边,构造中的参数为:

Point xxx
如果我将其更改为:

Point* xxx or `Point& xxx`
b。类似地,关于
std::vector
,我是否应该将其更改为:

std::vector<Edge*>
std::vector c。在我的例子中,哪种方法是更好的解决方案——保存所有对象而不使用
new
操作符,或者使用
new
操作符作为指针


任何建议都将不胜感激,谢谢:)

在您尝试优化代码之前,因为“不确定它们是否足够有效”,请进行测量,以确保存在已确认的需求。没有什么比过早的优化更浪费开发人员的时间了

不过快速看一下

简化
polyEdgeArray
的初始化很简单,假设您实际使用相同的
x
值初始化所有边的所有点

Point p(x,x);
std::vector<std::vector<Edge>> polyEdgeArray(N, std::vector<Edge>(M, Edge(p,p)));
点p(x,x);
向量阵列(N,std::向量(M,边(p,p));
也会做同样的事情

但是,如果代码不同(例如,
x
在整个循环中不是固定不变的),则有许多算法(在标准标头
中)用于初始化范围,或使用函数设置范围内所有元素的值。这些算法是模板化的,所以“值”可以表示“适当类的实例”

虽然我还没有检查标准算法是否可用于初始化您的
anglePointArray
,但我建议您这样做


在最坏的情况下,使用标准算法——当然,如果它们适用的话——将使代码更容易理解,因此更容易获得正确的结果,也更容易维护。标准库的实现者很有可能在优化标准算法方面做得比您在代码中做同样事情所能做的更好。

“上述代码在我的游戏中运行良好,但我不确定它们是否足够有效。”然后对其进行基准测试。不要优化正在工作的代码,除非你已经确定它太慢了,如果是的话,它的哪一部分太慢了,需要快多少。如果你猜测要优化什么,你会把时间浪费在错误的地方。首先关注“它是否有效”。谁知道呢?不管它有多快,你最终可能会为了另一种方法而扔掉所有这些代码。
std::vector<Edge*>
Point p(x,x);
std::vector<std::vector<Edge>> polyEdgeArray(N, std::vector<Edge>(M, Edge(p,p)));