2013-08-20 141 views
0

我想定义删除自定义类型对象和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)运作与以下错误编译:

error: no matching function for call to 'PointCollection::remove(Point&)'

Q1:我做的是去除new?正确Q2:如何解决我遇到的错误。

+0

'Point removedPoint = new Point'?这不应该是一个指针吗?很多东西与您的代码错误。什么是“自定义类型对象”? – dtech

+0

你不能说'这[someIndex]'(可以,但它会导致灾难)。 – juanchopanza

+0

你有没有试过这个= 0 :) – user2672165

回答

1

你的方法似乎是错误的。首先专注于你所需要的:

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

QVector是前一种。如果你删除并插入不在后面,你可能会得到糟糕的性能。因为每次进行更改时都必须重新分配整个矢量。

如果需要经常插入和删除链接列表,例如QLinkedList

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

这是一个简单的片段,介绍如何在向量和链表中插入和删除点。正如你看到的,最初两个容器含有点1 2 3 4

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; 

,再点5插在2的位置,然后再删除:您可以使用此方法来实现自己的包装类,如果你想。该向量对操作使用整数索引,该列表使用迭代器。这就是为什么当插入5时,我得到它的“索引”,因为不像向量它不会推回其余的,所以如果i2被删除,它不会删除插入的点5代替点2,但点2它仍然指的是它。另外,如果你想在列表中插入一个给定的索引,你可以使用begin iterator + index来“转发”迭代器适当的位置数量。

希望这是有道理的。当然,你可以在QPoint的地方使用你的点类。

+0

谢谢你的详细解答。 – Mike