我有一个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中找到更好的解决方案,我发现它很有用。如果有人有更好的解决方案,我会很感激。
答案 0 :(得分:2)
我到目前为止找到的最好的方法是使用QString::split
方法将空字符串作为分隔符,这恰好会创建QList
个字符(实际上是QList
1}}带有1个字符QString
s)。
const QString s("Hello world!");
const QString r(s.split("", QString::SkipEmptyParts).join('-'));
答案 1 :(得分: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);
}