2016-03-19 17 views
1

Ich habe einen Vektor einer benutzerdefinierten Klasse und möchte diesen Vektor sortieren. Es gibt 3 Attribute, auf deren Grundlage die Sortierung erfolgen kann. Ich verwende die Lambda-Funktion, um das Attribut zu erfassen, auf dessen Basis der Vektor sortiert werden soll. Ich erhalte jedoch Compilerfehler. Ich bin Einfügen den Code unten:Sortierung von STL-Containern mit Lambda-Funktionen

mapNode * PhotonMap::createTree(int start, int end) 
{ 
    mapNode *n = new mapNode(); 

    if (end - start == 0) 
    { 
     n->node.sPosition.setVector(pMap[end].sPosition); 
     n->node.pPower.setVector(pMap[end].pPower); 
     n->sAxis = -1; 
     n->left = NULL; 
     n->right = NULL; 
     return n; 
    } 

    BBox box; 

    if (!(end - start + 1 == pMap.size())) 
     box.setBBox(computeBox(start, end)); 

    int splitAxis = decodeSplitAxis(box.getMaxSpreadAxis()); 
    n->sAxis = splitAxis; 

    std::sort(pMap[start], pMap[end], [splitAxis](Photon &first, Photon &second) ->bool { return (first.sPosition.getValue(splitAxis) > second.sPosition.getValue(splitAxis)); }); 

    int mIndex = floor((start + end)/2); 

    n->node.sPosition.setVector(pMap[mIndex].sPosition); 
    n->node.pPower.setVector(pMap[mIndex].pPower); 

    if (mIndex == start) 
    { 
     //this means end - start = 1. There will be no left node! 
     n->left = NULL; 
     n->right = createTree(mIndex + 1, end); 
     return n; 
    } 
    else { 
     n->left = createTree(start, mIndex); 
     n->right = createTree(mIndex + 1, end); 
     return n; 
    } 

} 

Die Fehler Ich erhalte sind die folgenden:

Fehler C2784: ‚unknown-Typ std :: operator - (std :: move_iterator < _RanIt> & , const std :: move_iterator < _RanIt2> &): std :: move_iterator < _RanIt> & 'von 'Photon'

Fehler C2784: '' konnte nicht Template-Argument für ableiten' unknown-Typ std :: operator - (Nachteile t std :: reverse_iterator < _RanIt> &, const std :: reverse_iterator < _RanIt2> &) ': konnte nicht für Template-Argument ableiten 'const std :: reverse_iterator < _RanIt> &' von '' Photon

Fehler C2676: binär ‚-‘: ‚_Sort‘:: keine Übereinstimmungen überladene Funktion gefunden

Fehler C2780

: ‚VOID std‚Photon‘nicht diesen Operator oder eine Umwandlung in einen Typ

Fehler C2672 akzeptabel auf den vordefinierten Bediener nicht definiert :: _ Sort (_RanIt, _RanIt, _Diff, _Pr) ': erwartet 4 Argumente - 3 zur Verfügung gestellt

Photon ist ein struct. Seine Erklärung ist:

typedef struct Photon { 

    Vector sPosition; 
    Vector iDirection; 
    Vector pPower; 
    Vector norm; 

} Photon; 

Vector ein class dessen sind private Mitglieder:

int length; 
void allocateMemory(void); 
float vector[3]; 

Antwort

1

Die ersten beiden Parameter zu std::sort() sollte Iteratoren, keine Verweise auf den Inhalt des Behälters sein. Pointers wird auch funktionieren, so:

std::sort(&pMap[start], &pMap[end], /* your lambda goes here */); 

Da Sie keine Minimum, Complete, and Verifieable example, da auch sein kann, andere Probleme mit Ihrem Code vorsah, die Zusammenstellung verhindern, aber dies ist zumindest die erste einer von ihnen.