弱弱的问一下 QMap和QHash 区别?

addfourliu 2012-08-13 08:36:44
什么时候用QMap,什么时候用QHash呢?

在网上也搜了一些东西,QHash的查找效率比QMap要高一些
但是QMap有什么优点呢,感觉上QMap可以实现的,QHash也可以实现。。。
...全文
1761 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
addfourliu 2012-08-14
  • 打赏
  • 举报
回复
帮助文档上说:
The QMap class is a template class that provides a skip-list-based dictionary.
The QHash class is a template class that provides a hash-table-based dictionary.
可不可以理解成QMap 插入操作比较快,而查找慢;QHash插入操作慢,而查找速度快。。。
中才德创 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
什么时候用QMap,什么时候用QHash呢?

在网上也搜了一些东西,QHash的查找效率比QMap要高一些
但是QMap有什么优点呢,感觉上QMap可以实现的,QHash也可以实现。。。
[/Quote]同感。好像差不多。
addfourliu 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

>之前我也是这样认为的 ,QMap会自动排序,但是我有QHash试了一下,结果还是顺序输出。。。
C/C++ code

template<typename T>
void populateData(T &data)
{
data.insert("one", "aaa");
data.insert("two", "bbb");
data.insert("thr……
[/Quote]
当key值是int型的时候 , QMap和QHash输出的是一样的,关键字是QString时,QMap还是按关键字,而QHash就是随机输出。。。
stereoMatching 2012-08-13
  • 打赏
  • 举报
回复
>是的,不过有的时候用QMap,有的时候用QHash,又该如何选择呢?
http://www.amazon.com/Data-Structures-Algorithms-Adam-Drozdek-duquesne/dp/8131501159/ref=sr_1_3?s=books&ie=UTF8&qid=1344861197&sr=1-3&keywords=data+structure+c%2B%2B
stereoMatching 2012-08-13
  • 打赏
  • 举报
回复
>之前我也是这样认为的 ,QMap会自动排序,但是我有QHash试了一下,结果还是顺序输出。。。

template<typename T>
void populateData(T &data)
{
data.insert("one", "aaa");
data.insert("two", "bbb");
data.insert("three", "ccc");
data.insert("four", "ddd");
data.insert("five", "eee");
data.insert("six", "ggg");
}

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QHash<QString, QString> data;
populateData(data);
QMap<QString, QString> data2;
populateData(data2);

auto it2 = std::begin(data2);;
for(auto it = std::begin(data); it != std::end(data); ++it, ++it2)
qDebug() << it.value() << ", " << it2.value();

return app.exec();
}

addfourliu 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

使用上来讲,QMap和QHash可以认为没有区别。

实现上来讲,QMap应该是使用“平衡二叉树”实现的,QHash应该是使用“哈希”算法实现的。
[/Quote]
是的,不过有的时候用QMap,有的时候用QHash,又该如何选择呢?
addfourliu 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

補上程式碼,比較容易區分
C/C++ code

QMap<int, QString> data;
data.insert(3, "aaa");
data.insert(1, "bbb");
data.insert(7, "ccc");
for(auto it = std::begin(data); it != std::end(data); ++it……
[/Quote]

之前我也是这样认为的 ,QMap会自动排序,但是我有QHash试了一下,结果还是顺序输出。。。
从内存上来说 QMap是顺序存放的,QHash是随机的,但是如何解释 QHash输出也是按照关键字排序呢?
xiebin133 2012-08-13
  • 打赏
  • 举报
回复
数据量小,在乎查找速度的时候用QHash,数据量大,内存限制严格时用QMap
selina6874 2012-08-13
  • 打赏
  • 举报
回复
呵呵 跟楼上的兄弟学习一下
stereoMatching 2012-08-13
  • 打赏
  • 举报
回复
補上程式碼,比較容易區分

QMap<int, QString> data;
data.insert(3, "aaa");
data.insert(1, "bbb");
data.insert(7, "ccc");
for(auto it = std::begin(data); it != std::end(data); ++it)
qDebug() << it.value(); //bbb, aaa, ccc

如果使用的是qHash,輸出結果不一定會按照1, 3, 7的順序排序
侯老師的STL源碼剖析有仔細的講解紅黑樹和hash的實現
有興趣的可以去翻翻看
lexdene 2012-08-13
  • 打赏
  • 举报
回复
使用上来讲,QMap和QHash可以认为没有区别。

实现上来讲,QMap应该是使用“平衡二叉树”实现的,QHash应该是使用“哈希”算法实现的。
stereoMatching 2012-08-13
  • 打赏
  • 举报
回复
光從使用的行為上來說,QMap的資料有經過排序

QMap<int, QString> data;
data.insert(3, "aaa");
data.insert(1, "bbb");
data.insert(7, "ccc");
for(auto it = std::begin(data); it != std::end(data); ++it)
qDebug() << it.value();

其他的就是資料結構的差別
Qt怎麼實做我沒看過codes也不清楚

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧