指针和 QVector 问题
Posted
技术标签:
【中文标题】指针和 QVector 问题【英文标题】:Pointer and QVector issue 【发布时间】:2013-08-20 19:06:18 【问题描述】:我想定义从 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)
编译没有任何错误,但Point PointCollection::deletePoint(Point point)
functioned 中的this->remove(point);
编译时出现以下错误:
错误:没有匹配函数调用 'PointCollection::remove(Point&)'
Q1:我是否正确删除了new?
Q2:如何解决我遇到的错误。
【问题讨论】:
Point removedPoint = new Point
?不应该是指针吗?你的代码有很多问题。什么是“自定义类型对象”?
你不能说this[someIndex]
(好吧,你可以,但会导致灾难)。
你有没有试过这个=0 :)
@ddriver "自定义类型对象" - 我的意思是类型对象是Point,类型Point是我定义的。 |你的意思是 Point *removedPoint = new Point ?
@juanchopanza 仍然可以正常编译。为什么会导致灾难?什么是替代品?
【参考方案1】:
您的方法似乎总体上是错误的。首先关注你需要什么:
性能和内存效率或... 快速插入和删除QVector
属于前一种。如果您执行不在后面的删除和插入操作,您的性能可能会很差。因为每次进行更改时都必须重新分配整个向量。
如果您需要经常插入和删除,请使用链表,例如QLinkedList
。
Qt 已经提供了容器,实现你自己的容器并没有什么好处,你不可能比一群在这个框架上工作了 20 年的专业人员生产出更好的容器。
这里是一个简单的sn-p如何在向量和链表中插入和删除点。如果需要,您可以使用这些方法来实现自己的包装类:
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
。
【讨论】:
感谢您的详细解答。以上是关于指针和 QVector 问题的主要内容,如果未能解决你的问题,请参考以下文章