指针和QVector问题
Pointer and QVector issue
我想定义函数,这些函数将从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);
}
因为CCD_ 1,它没有像我想的那样工作。然后我将源修改为以下内容:
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)
函数中的this->remove(point);
编译有以下错误:
错误:调用"PointCollection::remove(Point&)"没有匹配的函数
Q1:我是否纠正了删除new?
的错误Q2:如何修复我的错误。
您的方法似乎总体上是错误的。首先关注您需要的东西:
- 性能和内存效率或
- 快速插入和删除
CCD_ 6属于前一类。如果删除和插入不在后面的内容,则可能会导致性能不佳。因为每次进行更改时都必须重新分配整个矢量。
如果需要插入和删除,请经常使用链表,例如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迭代器+索引来"转发"迭代器适当数量的位置。
希望这是有道理的。当然,您可以使用您的点类来代替QPoint
。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 将 Qvector<uint8_t> 转换为 QString
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- 指针和QVector问题