2017-02-16 149 views
0

我有一个QString我想生成一个新的字符串与所有字符分开。一种方法是手动迭代字符串,并在每个字符之后插入分隔符,但最后一个。如何将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-!" 

编辑:我自我回答它,因为我没有发现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(实际上,一个QList 1个字符的字符串)。

const QString s("Hello world!"); 
const QString r(s.split("", QString::SkipEmptyParts).join('-')); 
相关问题