指针和QVector问题

时间:2013-08-20 19:06:19

标签: c++ qt pointers qvector

我想定义将从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);
}
由于new,我没想到的是

。然后我将源修改为以下内容:

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)编译时没有任何错误,但this->remove(point);函数中的Point PointCollection::deletePoint(Point point)编译时出现以下错误:

  

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

问题1:我是否确实删除了new? Q2:如何解决我遇到的错误。

1 个答案:

答案 0 :(得分:1)

你的方法似乎总体上是错误的。首先关注您的需求:

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

QVector属于前者。如果删除和插入不在后面,则可能会导致性能下降。因为每次进行更改时都必须重新分配整个向量。

如果您需要经常插入和删除链接列表,例如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 iterator + index将迭代器“转发”适当的位置数。

希望这是有道理的。当然,您可以在QPoint

的位置使用您的点类