Qt 字符串中使用 QString::clear() 函数会丢失保留的 space 吗?

Do you lose the reserved space in a Qt string with the QString::clear() function?

我正在处理一个循环,我想将几​​个字符从一个字符串复制到另一个字符串。我知道限制在 20 个字符左右,所以我想在循环外执行此操作:

QString name;
name.reserve(25);

这样我就有了一个准备好填充的缓冲区,Qt 避免了每次解析名称时都重新分配它。只是,为了得到名字,我做了这样的事情:

for(int i(0); i < 20 && *s != '[=13=]'; ++i)
{
    name += *s;
}

这意味着我每次都必须重新设置名称。我该怎么做才能确保保留的 space 不会每次都丢失?

// will reserved memory be lost after this call?
name.clear();

// would that be more likely to keep the memory buffer?
name = "";

文档似乎没有说明任何一种方式。

完整的循环集是这样的:

QString name;
name.reserve(25);

for(QChar const *s(input.data()); *s != '[=15=]'; ++s)
{
    ...snip...
    if(<some condition>)
    {
        name.clear() // losing reserved data here?
        for(int i(0); i < 20 && *s != '[=15=]'; ++i)
        {
            name += *s;
        }
        ...snip...
    }
    ...snip...
}

调用QString::clear()会导致您保留的space丢失。考虑以下因素:

QString s;
s.reserve(25);
qDebug() << "Before Clear: " << s.capacity();
s.clear();
qDebug() << "After Clear: " << s.capacity();

输出:

Before Clear: 25
After Clear: 0

在不丢失保留 space 的情况下删除字符串内容的最有效方法是调用 QString::resize():

QString s;
s.reserve(25);
qDebug() << "Before Resize: " << s.capacity();
s.resize(0);
qDebug() << "After Resize: " << s.capacity();

输出:

Before Resize: 25
After Resize: 25

QString::resize()的实现中,对具有保留容量的字符串调用resize(0)相当于将内部大小值设置为0并设置内部缓冲区的第一个字符至 '[=19=]'.