【问题标题】:proper way to store objects in a std vector将对象存储在标准向量中的正确方法
【发布时间】:2017-04-23 03:51:49
【问题描述】:

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

这是一个 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`

b.同样关于std::vector&lt;Edge&gt;,我应该将其更改为:

std::vector<Edge*>

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

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

【问题讨论】:

  • “上面的代码在我的游戏中运行良好,但我不确定它们是否足够高效。”然后对其进行基准测试。在确定工作代码太慢之前不要优化工作代码,如果是,它的哪一部分太慢以及需要多快。如果你猜测要优化什么,你就会把时间浪费在错误的地方。首先关注“它是否有效”。谁知道呢——不管它有多快,你最终都可能把所有这些代码都扔给另一种方法。

标签: c++ pointers vector reference new-operator


【解决方案1】:

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

快速浏览一下......

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

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

会做同样的事情。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多