Указатель и вопрос 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) Функция скомпилирована со следующей ошибкой:

ошибка: нет соответствующей функции для вызова PointCollection :: remove (Point&)»

Q1: я исправил это удалено new?
Q2: Как исправить ошибку, которую я имею.

0

Решение

Ваш подход в целом неверен. Прежде всего сосредоточиться на том, что вам нужно:

  • производительность и эффективность памяти или …
  • быстрые вставки и удаления

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 будет удален, он не удалит точку 5, которая была вставлена ​​вместо точки 2, но точку 2 к которому это все еще относится.

Кроме того, если вы хотите вставить в список в заданном индексе, вы можете просто использовать начальный итератор + индекс для «пересылки» итератора на соответствующее количество позиций.

Надеюсь, это имело смысл. Естественно, вы можете использовать свой точечный класс вместо QPoint,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]