2017-11-21 1 views
3

Ich habe ein QVectorEntfernen Sie alle Elemente aus QVector, die kleiner als 0

QVector(48, 64, 31, -2, 14, 5, 7, -3, -1, 13) 

Ich möchte wissen, wie Qt-Mechanismus verwenden, um alle Elemente zu entfernen, die kleiner als 0

Wie ich tun Mach das auf eine einfache Art und Weise?
Dank

+4

versuchen Sie es mit [diese Methode] (http://en.cppreference.com/w/cpp/algorithm/remove) – JLev

Antwort

3

QVector der Schnittstelle erlaubt es mit den std Algorithmen verwendet werden, so können Sie nur verwenden, um die erase-remove idiom

QVector<int> vec; 
... 
vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i) { return i < 0; }), 
      vec.end()); 

Als Erklärung:

remove_if nimmt eine Reihe von Iteratoren (vec.begin(), vec.end()) , und verschiebt alle Elemente, für die das bereitgestellte Lambda bis zum Ende wahr ist. Es gibt dann einen Iterator an den Anfang dieses Bereichs zurück.

erase nimmt eine Reihe von Iteratoren (der zurückgegebene Wert von remove_if und vec.end()) und löscht sie aus dem Vektor.

Arbeitsbeispiel:

#include <QVector> 
#include <iostream> 

int main() 
{ 
    QVector<int> vec { 1, 2, 3, -1, -2, -3, 4, 5, 6, -7, -8, -1, 1, 2, 3 }; 

    // erase all elements less than 0 
    vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i) { return i < 0; }), 
       vec.end()); 

    // print results 
    for (int i : vec) 
     std::cout << i << ' '; 
    std::cout << '\n'; 

    return 0; 
} 

Ausgang:

./a.out 
1 2 3 4 5 6 1 2 3 
+1

Genau, wenn das Profilieren beider Lösungen Remis Lösung dauert etwa 2x Zeit im Vergleich zu dieser Lösung ... – Mike

0
// Create your list 
QVector<int> listIntegers; 
... 

// Remove all numbers < 0 from QVector<int> 
QMutableVectorIterator<int> i(listIntegers); 
while (i.hasNext()) { 
    if (i.next() < 0) 
     i.remove(); 
} 

Sie können auch dieses Stück Code anpassen zu tun, was Sie wollen, nur durch den Zustand im Innern der while-Schleife zu ändern.

+1

JLev schlug nicht vor, Iteratoren zu verwenden. Die Frage ist eine typische Anwendung des [Erase-remove-Idioms] (https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom) und dies ist, was JLev vorgeschlagen hat. Ich profilierte beide Lösungen, diese Lösung benötigt etwa die doppelte Zeit, die für das Erase-Remove-Idiom erforderlich ist. Da der Container während der Operation möglicherweise mehrmals skaliert wird ... – Mike

+1

@SteveLorimer, Nein, das erste Element des Arrays wird nicht übersprungen, da die Java-Iteratoren von Qt auf "dazwischen" -Elemente und nicht auf Elemente selbst verweisen. siehe [hier] (https://doc.qt.io/qt-5/containers.html#java-style-iterators) – Mike

+0

@Mike verstanden, danke für die Klarstellung - ich habe meinen Kommentar gelöscht –

Verwandte Themen