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=]'
.
我正在处理一个循环,我想将几个字符从一个字符串复制到另一个字符串。我知道限制在 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=]'
.