Ограничить длину QStringList при печати - PullRequest
0 голосов
/ 18 января 2019

Я хотел бы ограничить длину моего сообщения при использовании QStringList, печатая только первые пять строк.

Вот моя реализация:

// 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;
    }
}

Есть ли более эффективный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Под руководством Хаурона я обнаружил, что это может быть наиболее эффективным способом:

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
}
0 голосов
/ 18 января 2019

Написать помощнику:

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;
}

Если вам нужна производительность, то использование arg не рекомендуется (необходимо выполнить дополнительную работу по разбору строки формата, и вы не управляете выделениями).

0 голосов
/ 18 января 2019

Попробуйте использовать QStringList::join(...) (http://doc.qt.io/qt-5/qstringlist.html#join).

Поскольку вы хотите объединить только до первых 5 элементов, чтобы избежать копирования списка, используйте итераторы, т. Е .:

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

... но это не сработает, так как QStringList не имеет такого конструктора. Вам придется скопировать QStrings в новый QStringList. В идеале, копии должны быть мелкими - буфер распределяется между двумя QStrings в двух разных QStringLists, но я не уверен, что Qt делает это так (возможно, и предоставит отдельный буфер, только если вы попытаетесь изменить базовую строку).

В любом случае, как только вы получите QStringList в качестве подсписка, просто вызовите:

subList.join(", ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...