在std向量中存储对象的正确方法

时间:2017-04-23 03:51:50

标签: 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;
    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来存储我生成的Edge对象:

std::vector<std::vector<Edge>> polyEdgeArray;

以下是我初始化polyEdgeArray

的方法
polyEdgeArray.clear();
for (int i = 0; i < N; i ++) {
    std::vector<Edge> edgeArray;
    for (int j = 0; j < M; j ++) {
        Point s = Point(x, x);
        Point e = Point(x, x);
        edgeArray.push_back(Edge(s, e));
    }
    polyEdgeArray.push_back(edgeArray);
}

我还有另一个矢量来保存所有AnglePoint对象:

std::vector<AnglePoint> anglePointArray;

以下是我初始化anglePointArray

的方法
for (int i = 0, l = (int)polyEdgeArray.size(); i < l; i ++) {
    std::vector<Edge> edgeArray = polyEdgeArray[i];

    for (int j = 0, ll = (int)edgeArray.size(); j < ll; j ++) {
        Edge edge = edgeArray[j];
        Edge preEdge = (j == 0 ? edgeArray[ll - 1] : edgeArray[j - 1]);
        Edge nextEdge = (j == ll - 1 ? edgeArray[0] : edgeArray[j + 1]);
        addEndPointAnglePoint(edge.startPoint, edge, preEdge, nextEdge);
    }
}

void addEndPointAnglePoint(Point& point,
                           Edge& edge,
                           Edge& prevEdge,
                           Edge& nextEdge)
{
    AnglePoint anglePoint = AnglePoint(point, prevEdge, nextEdge);
    anglePointArray.push_back(anglePoint);
}

然后,这是我游戏的背景,polyEdgeArrayanglePointArray的数量会非常大,比如100000。

并且,每帧将重新生成/ {重新计算polyEdgeArrayanglePointArray

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

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

一个。对于Edge类,构造中的参数是:

Point xxx

如果将其更改为:

会更好吗?
Point* xxx or `Point& xxx`

湾同样关于std::vector<Edge>,我应该将其更改为:

std::vector<Edge*>

℃。就我而言,哪种方式是更好的解决方案 - 在没有new运算符或new运算符作为指针的情况下保存所有对象。

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

1 个答案:

答案 0 :(得分:1)

在您尝试优化代码之前,因为“不确定它们是否足够有效”,请进行测量以确保确认需要。开发人员的时间比早期优化更糟糕。

快看......但

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

Point p(x,x);
std::vector<std::vector<Edge>> polyEdgeArray(N, std::vector<Edge>(M, Edge(p,p)));

会做同样的事情。

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

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

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