指针和QVector问题

Pointer and QVector issue

本文关键字:问题 QVector 指针      更新时间:2023-10-16

我想定义函数,这些函数将从QVector中删除自定义类型对象和索引。最初的来源如下:

    Point PointCollection::RemovePoint(int index)
{
    Point removedPoint = new Point(this[index].Id, this[index].X, this[index].Y);
    this->remove(index);
    updateCentroid();
    return (removedPoint);
}
Point PointCollection::RemovePoint(Point p)
{
    Point removedPoint = new Point(p.GetId(), p.GetX(), p.GetY());
    this.remove(p);
    updateCentroid();
    return (removedPoint);
}

因为CCD_ 1,它没有像我想的那样工作。然后我将源修改为以下内容:

Point PointCollection::deletePoint(int Index)
{
    Point deleted = Point(this[Index].Id, this[Index].X, this[Index].Y);
    this->remove(Index);
    updateCentroid();
    return(deleted);
}
Point PointCollection::deletePoint(Point point)
{
    Point deleted = Point(point.GetId(), point.GetX(), point.GetY());
    this->remove(point);
    updateCentroid();
    return(deleted);
}

现在Point PointCollection::deletePoint(int Index)编译没有任何错误,但Point PointCollection::deletePoint(Point point)函数中的this->remove(point);编译有以下错误:

错误:调用"PointCollection::remove(Point&)"没有匹配的函数

Q1:我是否纠正了删除new?的错误Q2:如何修复我的错误。

您的方法似乎总体上是错误的。首先关注您需要的东西:

  • 性能和内存效率或
  • 快速插入和删除

CCD_ 6属于前一类。如果删除和插入不在后面的内容,则可能会导致性能不佳。因为每次进行更改时都必须重新分配整个矢量。

如果需要插入和删除,请经常使用链表,例如QLinkedList

Qt已经提供了容器,实现自己的容器并没有带来太多好处,你不太可能生产出比一群在这个框架上工作了20年的专业人员更好的容器。

下面是一个如何在矢量和链表中插入和删除点的简单片段。如果需要,您可以使用这些方法来实现自己的包装器类:

    QVector<QPoint> myPointVector;
    QLinkedList<QPoint> myPointList;
    // push back some data
    myPointVector << QPoint(1, 1) << QPoint(2, 2) << QPoint(3, 3) << QPoint(4, 4);
    myPointList << QPoint(1, 1) << QPoint(2, 2) << QPoint(3, 3) << QPoint(4, 4);
    foreach (QPoint p, myPointVector) qDebug() << p;
    foreach (QPoint p, myPointList) qDebug() << p;
    qDebug() << endl;    
    auto i1 = myPointVector.indexOf(QPoint(2, 2));
    auto i2 = qFind(myPointList.begin(), myPointList.end(), QPoint(2,2));
    myPointVector.insert(i1, QPoint(5,5)); // or existing point object / reference
    auto i3 = myPointList.insert(i2, QPoint(5,5));
    foreach (QPoint p, myPointVector) qDebug() << p;
    foreach (QPoint p, myPointList) qDebug() << p;
    qDebug() << endl;
    QPoint deletedFromVector = myPointVector[i1]; // use those to return before deleting
    QPoint deletedFromList = *i3;  // note you don't need to construct just assign  
    myPointVector.remove(i1);
    myPointList.erase(i3);
    foreach (QPoint p, myPointVector) qDebug() << p;
    foreach (QPoint p, myPointList) qDebug() << p;
    qDebug() << endl;

如您所见,最初两个容器都包含点1 2 3 4,然后点5被插入到2的位置,然后再次移除。向量使用整数索引进行运算,列表使用迭代器。这就是为什么当插入5时,我会得到它的"索引",因为与向量不同,它不会推回其余的,所以如果移除i2,它将不会移除代替点2插入的点5,而是它仍然指向的点2。

此外,如果您想在给定索引的列表中插入,您可以使用begin迭代器+索引来"转发"迭代器适当数量的位置。

希望这是有道理的。当然,您可以使用您的点类来代替QPoint