Ich möchte die Länge meiner Nachricht bei Verwendung einer QStringList begrenzen, indem ich nur die ersten fünf Zeichenfolgen drucke.

Hier ist meine Implementierung:

// QStringList missing is already filled with random strings
QString warning = "Missing: ";
// Limit the warning up to the fifth element
for ( int i = 0; i < missing.size(); ++i ) {
    if ( i <= 4 ) {
        warning += ", %1".arg( missing.at(i) );
    } else {
        warning += ", ...";
        break;
    }
}

Gibt es einen effizienteren Weg, dies zu tun?

0
gses 18 Jän. 2019 im 13:25

3 Antworten

Beste Antwort

Unter der Anleitung von Hauron stellte ich fest, dass dies der effizienteste Weg ist:

if ( !missing.empty() ) { 
  auto noOfPrintStr = 5;
  QString warning = tr( "Missing: %1" )
                    .arg( missing.mid( 0, noOfPrintStr-1 ).join( ", " ) );
  if ( missing.size() > noOfPrintStr )
    warning += ", ...";

  // print the warning
}
1
gses 18 Jän. 2019 im 13:35

Schreibe einen Helfer:

QString joinWithLimit(size_t lenLimit, const QStringList &strings, const QString &separator = ", ")
{
    QString result;
    result.reserve(lenLimit); // to reduce number of allocations
    result += strings.front();

    for (int i = 1; i < strings.size(); ++i)
    {
       const auto &s = strings[i];
       if (result.length() + separator.length() + s.length() > lenLimit) {
           return result;
       }
       result += separator;
       result += s;
    }
    return result;
}

Wenn Sie Leistung benötigen, wird die Verwendung von arg nicht empfohlen (es muss ein zusätzlicher Job zum Parsen der Formatzeichenfolge ausgeführt werden und Sie steuern die Zuordnungen nicht).

0
Marek R 18 Jän. 2019 im 13:46

Versuchen Sie es mit QStringList::join(...) (http://doc.qt.io/) qt-5 / qstringlist.html # join).

Da Sie nur bis zu den ersten 5 Elementen zusammenführen möchten, verwenden Sie Iteratoren, um das Kopieren der Liste zu vermeiden, d. H.:

QString foo(const QStringList& myList)
{
   auto iterBegin = myList.begin();
   auto iterEnd = iterBegin + std::min(myList.size(), 5);
   return QStringList{iterBegin, iterEnd}.join(", ");
}

... aber es würde nicht funktionieren, da QStringList keinen solchen Konstruktor hat. Sie müssten das QStrings in ein neues QStringList kopieren. Im Idealfall wären die Kopien flach - der Puffer wird zwischen den beiden QStrings in zwei verschiedenen QStringLists geteilt, aber ich bin nicht sicher, ob Qt dies auf diese Weise tut (es kann sein, und einen separaten Puffer bereitstellen) nur wenn Sie versuchen, die zugrunde liegende Zeichenfolge zu ändern).

In beiden Fällen rufen Sie einfach Folgendes auf, sobald Sie QStringList als Unterliste haben:

subList.join(", ");
-1
hauron 18 Jän. 2019 im 10:37