QMap (映射表) & QHash (哈希表)

QMap、QHash 选择

数据量小,在乎查找速度的时候用QHash; 数据量大,内存限制严格时用QMap。


QMap提供了一个从类项为key的键到类项为T的直的映射,通常所存储的数据类型是一个键对应一个值,并且按照Key的次序存储数据,这个类也支持一键多值的情况,用类QMultiMap;

QHash具有和QMap几乎完全一样的APi,此类维护这一张哈希表,表的大小和数据项是自适应的,QHash是以任意的顺序住址他的数据,当然了他也是可以支持一键多值的,QMultiHash;

两种之间的区别是:

QHash查找速度上显著于QMap;

QHash以任意的方式进行存储,而QMap则是以key顺序进行存储;

Qhash 的键类型必须提供operator==()和yige 全局的qHash(key)函数。而QMap的键类型key必须提供operator<()函数(自定义类型必须重载这些运算符);

他们同样也是有两种风格的迭代容器。用来进行遍历的。

小结:

(1)Qt中提供了用于存储键值对的类模板

(2)QHash和QMap遵循相同的使用接口

(3)QHash的查找速度快于QMap;

(4)QMap需要的内存空间低于QHash;

(5)QHash对于Key类型的要求高于QMap。(QHash要求key类型操作两个操作符函数)


QHash

 QHash是使用散列存储的键-值对。它的接口同QMap几乎一样,但是它们两个的实现需求不同。QHash的查找速度比QMap快很多,并且它的存储是不排序的,更高效。对于QHash而言,K的类型必须重载了==操作符,并且必须被全局函数qHash()所支持,这个函数用于返回key的散列值。Qt已经为int、指针、QChar、QString和QByteArray实现了qHash()函数,都可以直接作为QHash的索引

QMap 与 QHash 相同点

根据key,获取value:

    const T value(const Key &key, const T &defaultValue = T()) const;
    T &operator[](const Key &key);
    const T operator[](const Key &key) const;

取引用,并且想改变map中的值,必须使用上面的第二种函数,map[key].insert等其他函数(),即

eg: map [i] .insert(,,,,,,);

若使用中间变量,则变为值传递,不改变map自身的值,如:

eg: QList list = map[i];  list.insert(,,,);   这里的 [ ] 不是引用,因为list 的插入,map没有任何改变,map中的map [i]  并没有改变。

eg: map[i] = str;   这里的 [ ] 也是取引用,因为是左值;

编程时需要特别注意的是:

在QHash和QMap中查找一个关键字的值,可以使用value()函数和[ ]操作符。但是一般来说应该使用value()函数来进行查找。

因为[ ]操作符在查询的key不存在的时候,会自动在列表中创建此关键字的一个项,从而造成不必要的内存开销。


map 插入:

map.insert("eins", 1);
map["eins"] = 1;

遍历

QMap<QString, int>::const_iterator i;
    for( i=map.constBegin(); i!=map.constEnd(); ++i)
        qDebug() << i.key() << " : " << i.value();

其他

    bool contains(const Key &key) const;
    const Key key(const T &value, const Key &defaultKey = Key()) const;
注意: 没有 .at,因为key不是索引index; Map 是键值对。


QMap与QHash都是一对一或多对以的映射,可以使用QMultiMap与QMultiHash建立一对多的映射。

比如QMultiMap <int,QString> map;

map[3]="Hello";

map.insert(3,"World");

调用map[3]时,就会得到一个QList<QString>类型的变量。

遍历时依然可用 QMapIterator


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值