c++ - 指针和 QVector 问题

标签 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) functioned 编译时出现以下错误:

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

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

最佳答案

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

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

QVector 属于前一种。如果您执行不在后面的删除和插入操作,您的性能可能会很差。因为每次进行更改时都必须重新分配整个 vector 。

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

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

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

    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 的位置,然后再次被删除。 vector 使用整数索引进行操作,列表使用迭代器。这就是为什么当插入 5 时,我得到它的“索引”,因为与 vector 不同,它不会推回其余部分,所以如果 i2 被删除,它不会删除插入点 2 的点 5,而是点 2它仍然指的是。

另外,如果你想在给定索引的列表中插入,你可以只使用开始迭代器+索引来“转发”迭代器适当数量的位置。

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

关于c++ - 指针和 QVector 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18343104/

相关文章:

c++ - 为什么 Qt Creator 在包含的路径中找不到包含的 header - 即使 qmake 能够找到它们

c++ - 如何读取 XSD 架构元素 <xs :schema 的 'Version' 属性

c++ - Qt - 编译时错误 2

两个指针可以使用相同的地址吗? (代码解释)

c++ - GMP库函数

c++ - 使用箭头符号打印圆圈

c++ - 为什么指针更快更高效

c - 使用 memset() 函数及其如何影响内存块

c++ - 当访问要插入 union vector 中的字符串字符时, vector 中的字符串会变得困惑

c++ - 查找立体图像中匹配像素的距离