说明:
1、为了保证有序,结合双向链表,使得增删改查的复杂度都不超过O(lgN),原来QMap的增删改查的复杂度也是O(lgN)
2、只是实现了思路,key和value都是使用QVariant类,实用性不是很好。更好的应该使用模板来实现template<class K, class V>,只是用模板的时候ValueIterator中的it不知道怎么写(语法问题,编译不过~_~),就先偷懒使用QVariant了。
3、测试代码如下:
#include <QCoreApplication> #include <myorderedmap.h> #include <QDebug> #include <QElapsedTimer> #include <QTime> #include <qmath.h> void test1(int n) { int k = 0, v = 0; qsrand(QTime::currentTime().msec()); MyOrderedMap oMap; QElapsedTimer timer; for (int i = 0; i < n; ++i) { v = qrand(); k = i; //qrand()*qrand(); oMap.insert(k, v); //qDebug() << k; } timer.start(); oMap.value(k); qint64 queryTime = timer.nsecsElapsed(); timer.restart(); for (int i = 0; i < n; ++i) { if (i % 2 == 0) { oMap.remove(i); } } qint64 removeTime = timer.nsecsElapsed() / (n/2); qDebug() << n << oMap.size() << oMap.keys().size() << " " << queryTime << removeTime; //qDebug() << QList<QVariant>::fromStdList(oMap.keys().toStdList()); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // MyOrderedMap oMap; // oMap.insert(123, 456); // oMap.insert(111, 222); // oMap.insert("abc", "def"); // oMap.insert("xxxxxxxx", "yyyyyyyyyy"); // oMap.insert(110, 119); // qDebug() << oMap.value(111); // oMap.remove(QVariant(123)); // qDebug() << oMap.size(); // qDebug() << QList<QVariant>::fromStdList(oMap.keys().toStdList()); // oMap.clear(); for (int i = 1; i <= 20; i++) { test1(100 * qPow(2, i)); } //test1(10000); return a.exec(); }