QString: optimize remove(QChar, Qt::CaseSensitivity)
remove(int, int) with O(N) was used in a loop. We had a quadratic complexity. Use erase-remove idiom to fix it. Change-Id: I643a2a75619ec5ea2bf99e48a25f64a7f69ba156 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
This commit is contained in:
parent
b5222307af
commit
be94fc445a
@ -2300,21 +2300,20 @@ QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
|
||||
*/
|
||||
QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
|
||||
{
|
||||
int i = 0;
|
||||
ushort c = ch.unicode();
|
||||
if (cs == Qt::CaseSensitive) {
|
||||
while (i < d->size)
|
||||
if (d->data()[i] == ch)
|
||||
remove(i, 1);
|
||||
else
|
||||
i++;
|
||||
} else {
|
||||
c = foldCase(c);
|
||||
while (i < d->size)
|
||||
if (foldCase(d->data()[i]) == c)
|
||||
remove(i, 1);
|
||||
else
|
||||
i++;
|
||||
const int idx = indexOf(ch, 0, cs);
|
||||
if (idx != -1) {
|
||||
const auto first = begin(); // implicit detach()
|
||||
auto last = end();
|
||||
if (cs == Qt::CaseSensitive) {
|
||||
last = std::remove(first + idx, last, ch);
|
||||
} else {
|
||||
const QChar c = ch.toCaseFolded();
|
||||
auto caseInsensEqual = [c](QChar x) {
|
||||
return c == x.toCaseFolded();
|
||||
};
|
||||
last = std::remove_if(first + idx, last, caseInsensEqual);
|
||||
}
|
||||
resize(last - first);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user