2017-02-16 19 views
0

私はQStringを持っており、すべての文字を区切って新しい文字列を生成したいと思います。 1つの方法は、手動で文字列を繰り返し、各文字の後ろに区切り文字を挿入することです。QStringを個々の文字に分割して新しい文字列を作成するには?

ループを実装することなく、より良い方法があるか、少なくとも直接的な方法がありますか?たとえば、関数パラメータとして直接使用するためです。可能であれば、Qtのみを使用してください。

const QString s("Hello world!"); 
const QString r(some_separating_function(s)); 
qDebug() << r; 

予想される出力は

"H-e-l-l-o- -w-o-r-l-d-!" 

EDITを次のようになります。私はSOでより良い解決策を見つけることができませんでしたので、それを自己答えだと私はそれが便利。誰かがより良い解決策を持っているなら、私はそれを感謝します。

答えて

1

は、任意の一時を割り当てていない一つの方法です:

// https://github.com/KubaO/stackoverflown/tree/master/questions/string-sep-42276882 
#include <QtCore> 

QString separate1(const QString & string, const QString & separator) { 
    QString result; 
    result.reserve(string.size() * (1 + separator.size())); 
    for (auto ch : string) { 
     result.append(ch); 
     result.append(separator); 
    } 
    result.chop(separator.size()); 
    return result; 
} 

ああ、QStringのコピー・オン・ライトは、まだいくつかのオーバーヘッドを持っているので、直接データを扱うことはさらに高速になります:

QString separate(const QString & string, const QString & separator) { 
    QString result{string.size() + (string.size()-1) * separator.size(), 
        Qt::Uninitialized}; 
    auto const end = result.data() + result.size(); 
    int s{}; 
    for (auto p = result.data(); p < end;) { 
    *p++ = string.at(s++); 
     if (Q_LIKELY(p < end)) 
     for (auto const ch : separator) 
      *p++ = ch; 
    } 
    return result; 
} 

そして、それをチェックアウトする:

int main() { 
    auto const separator = QStringLiteral("-"); 
    auto const source = QStringLiteral("Hello world!"); 
    auto const compare = QStringLiteral("H-e-l-l-o- -w-o-r-l-d-!"); 
    Q_ASSERT(separate1(source, separator) == compare); 
    Q_ASSERT(separate(source, separator) == compare); 
} 
2

QString::splitメソッドを空の文字列に区切り文字として使用すると、QList(実際には1文字の文字列でQList)が作成されます。ここで

const QString s("Hello world!"); 
const QString r(s.split("", QString::SkipEmptyParts).join('-')); 
関連する問題