2016-07-23 13 views
0

ich für die ideale Art und Weise bin auf der Suche auf einem Vektor zu arbeiten (löschen, hinzufügen), sondern auch in der Lage sein, einen Vergleich zwischen den Elementen zu machenC++ einen Vektor der Elemente zu manipulieren

Somthing gefällt die:

[first]...[i-1][i][i+1]...[j]...[last] <-vector 

, wenn die Bedingung in einem Vergleich mit i erfüllt ist & j dann folgendes tun:

[first]...[X][X][X][i*]...[j]...[last] <-vector 

wobei X ein gelöschtes Element ist (in unserem Fall i-1, i, i + 1) und i * die Ersetzung eleme nt. jetzt weiß ich, der Abstand zwischen i und j ist 2.

Soweit ich weiß (neu in C++) gibt es 2 Möglichkeiten, dies zu handhaben. entweder mit einer direkten Annäherung an den Vektor (myVec.at(i).func()>myVec.at(j).func()), aber dann scheint es, dass Sie eingeschränkt sind, weil Funktionen wie löschen & einfügen abhängig von einem Iterator.

der andere Weg ist mit Iterator, aber der Vergleich (i & j) scheint zu viel Bewegung auf dem Vektor zu envolvieren. Vergleiche zum Beispiel i und j (setze es voraus, dass ich den Iterator nach j verschiebe, vorausgesetzt, ich möchte keinen weiteren Iterator), und lösche 3 Elemente, gehe zurück zu i-1, um das Element usw. zu ziehen.

Ich denke, dass Sie mischen, aber es sieht schrecklich:

if(distance(myVec->begin(),it)+2<myVec->size() || ((Operation*) (*it))->Precedence() >= ((Operation*) myVec->at(distance(myVec->begin(),it)+2))->Precedence()); 

der obige Code ist Beispiel für ein einfachen, wenn die erste Prüfung, dass j im Bereich des Vektors ist, und wenn nicht zu vergleichen, i und j (i mit Iterator, j mit std :: distance).

+0

Ist der nächste mögliche Auftreten nach ‚j‘ oder gibt es einige Wiederholung? – Surt

+0

Vektor-Iteratoren sind sehr billig zu konstruieren, da der Speicher für den Vektor garantiert zusammenhängend ist, ist es im Grunde eine Pointer-Addition. Wenn Sie das Element "i" entfernen wollen, können Sie 'myVecerase (myVec.begin() + i);'. –

Antwort

0

Vektoren sind garantiert zusammenhängende Speicher, Umgang mit der Indexierung ist also sehr billig. Das folgende ist durchaus akzeptabel:

//assuption: i, i-1 and i+1 are all valid vector elements 
if(i + 2 < vec.size() && condition(vec[i], vec[i+2])) 
{ 
    vec.erase(vec.begin() + (i-1), vec.begin() + (i + 1)); 
} 

Alle Indizierungsvorgänge oben sind einfach Pointer-Arithmetik: Sie brauchen sich nicht um Gemeinkosten auf jeder Iterator Schöpfung Sorge beteiligt

Verwandte Themen