2013-08-20 3 views
0

QVector에서 자체 정의 유형의 객체와 색인을 삭제하는 함수를 정의하려고합니다. 은 원래 소스는 다음과 같이이었다 : 나는 때문에 new 생각으로 작동하지 않는포인터 및 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); 
} 

.

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);는 다음과 같은 오류 컴파일 작용 :

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

Q1 : 그럼 다음에 소스를 수정 내가 new?을 제거하는 올바른 짓 질문 2 : 내가 겪고있는 오류를 해결하는 방법.

+0

'Point removedPoint = new Point'? 그게 포인터가 아니어야합니까? 코드에 문제가 많습니다. "자체 정의 유형 객체"란 무엇입니까? – dtech

+0

'this [someIndex]'라고 말할 수는 없습니다 (물론 가능하지만 재앙이 될 것입니다). – juanchopanza

+0

혹시 이것을 시도해 보셨습니까 = 0 : – user2672165

답변

1

귀하의 접근 방식은 전반적으로 잘못된 것으로 보입니다. 모두 당신이 필요에 초점을 첫째 :

  • 성능과 메모리 효율 또는 ...
  • 빠른 삽입과

QVector을 삭제는 전 종류이다. 뒷 부분에없는 삭제 및 삽입을 수행하면 성능이 저하 될 수 있습니다. 변경 작업을 수행 할 때마다 전체 벡터를 다시 할당해야하기 때문입니다.

자주 삽입하고 삭제해야하는 경우 연결된 목록으로 이동하십시오 (예 : QLinkedList).

Qt는 이미 컨테이너를 제공하고 있으며, 자신 만의 구현은 많은 이점을 제공하지 않습니다. 20 년 동안이 프레임 워크에서 작업하는 많은 전문가들보다 나은 컨테이너를 생산할 가능성은 없습니다.

다음은 벡터 및 링크 된 목록에서 포인트를 삽입하고 삭제하는 간단한 방법입니다. 다시 제거 후, 2의 장소에 삽입

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 포인트 : 당신은 당신이 원하는 경우 자신의 래퍼 클래스를 구현하기 위해이 방법을 사용할 수 있습니다 . 벡터는 작업에 정수 인덱스를 사용하며 목록에는 반복자가 사용됩니다. 그래서 5가 삽입 될 때 벡터와 달리 나머지를 뒤로 밀지 않을 것이기 때문에 "인덱스"를 얻습니다. i2가 제거되면 점 2 대신 삽입 된 점 5가 제거되지 않고 점 2 여전히 언급하고있다.

또한 지정된 인덱스의 목록에 삽입하려는 경우 begin iterator + 인덱스를 사용하여 반복자에 적절한 수의 위치를 ​​"전달"할 수 있습니다.

그 의미가 되길 바랍니다. 당연히 당신은 QPoint 대신에 포인트 클래스를 사용할 수 있습니다.

+0

자세한 답변 해 주셔서 감사합니다. – Mike