我想定义一些函数,这些函数将从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&)'
Q1:我是否确实纠正了删除的
new?
Q2:如何解决我遇到的错误。
最佳答案
您的方法似乎总体上是错误的。首先关注您的需求:
性能和内存效率或...
快速插入和删除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
位置使用点类。