diff --git a/src/base/bittorrent/bencoderesumedatastorage.cpp b/src/base/bittorrent/bencoderesumedatastorage.cpp index b217afcc6..87b349f14 100644 --- a/src/base/bittorrent/bencoderesumedatastorage.cpp +++ b/src/base/bittorrent/bencoderesumedatastorage.cpp @@ -189,8 +189,13 @@ void BitTorrent::BencodeResumeDataStorage::loadQueue(const Path &queueFilename) return; } + QHash registeredTorrentsIndexes; + registeredTorrentsIndexes.reserve(m_registeredTorrents.length()); + for (qsizetype i = 0; i < m_registeredTorrents.length(); ++i) + registeredTorrentsIndexes.insert(m_registeredTorrents.at(i), i); + const QRegularExpression hashPattern {u"^([A-Fa-f0-9]{40})$"_s}; - int start = 0; + qsizetype queuePos = 0; while (true) { const auto line = QString::fromLatin1(queueFile.readLine(lineMaxLength).trimmed()); @@ -201,11 +206,15 @@ void BitTorrent::BencodeResumeDataStorage::loadQueue(const Path &queueFilename) if (rxMatch.hasMatch()) { const auto torrentID = BitTorrent::TorrentID::fromString(rxMatch.captured(1)); - const int pos = m_registeredTorrents.indexOf(torrentID, start); + const qsizetype pos = registeredTorrentsIndexes.value(torrentID, -1); if (pos != -1) { - std::swap(m_registeredTorrents[start], m_registeredTorrents[pos]); - ++start; + if (pos != queuePos) + { + m_registeredTorrents.swapItemsAt(pos, queuePos); + registeredTorrentsIndexes.insert(m_registeredTorrents.at(pos), pos); + } + ++queuePos; } } }