From 39efc7c3e3a08580f00a19678d2975608d41aa17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Wed, 19 Feb 2014 11:27:50 +0100 Subject: Optimize QVector::mid Change-Id: Iff7d9ec85a095c6712e6045e7708bb88eac629e1 Reviewed-by: Oswald Buddenhagen --- src/corelib/tools/qvector.h | 12 +++++++----- tests/auto/corelib/tools/qvector/tst_qvector.cpp | 2 ++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 9692477e18..c547cec7be 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -833,11 +833,13 @@ Q_OUTOFLINE_TEMPLATE QVector QVector::mid(int pos, int len) const break; } - QVector copy; - copy.reserve(len); - for (int i = pos; i < pos + len; ++i) - copy += at(i); - return copy; + QVector midResult; + midResult.reallocData(0, len); + T *srcFrom = d->begin() + pos; + T *srcTo = d->begin() + pos + len; + midResult.copyConstruct(srcFrom, srcTo, midResult.data()); + midResult.d->size = len; + return midResult; } template diff --git a/tests/auto/corelib/tools/qvector/tst_qvector.cpp b/tests/auto/corelib/tools/qvector/tst_qvector.cpp index 776251fa52..97f370f146 100644 --- a/tests/auto/corelib/tools/qvector/tst_qvector.cpp +++ b/tests/auto/corelib/tools/qvector/tst_qvector.cpp @@ -1379,6 +1379,8 @@ void tst_QVector::mid() const list << "foo" << "bar" << "baz" << "bak" << "buck" << "hello" << "kitty"; QCOMPARE(list.mid(3, 3), QVector() << "bak" << "buck" << "hello"); + QCOMPARE(list.mid(6, 10), QVector() << "kitty"); + QCOMPARE(list.mid(-1, 20), list); QCOMPARE(list.mid(4), QVector() << "buck" << "hello" << "kitty"); } -- cgit v1.2.3