生活
qmap遍历 、map遍历key
2023-04-20 02:28  浏览:45

qhash顺序设置

1——创建,键值对的方式插入,数据类型随意,这里以键int,值QString示例。

QHashint,QString qhash;

2——插入

//方式一

qhash[1] = "1";

qhash[2] = "2";

qhash[3] = "3";

//方式二

qhash.insert(4, “4”);

通常,QHash 每个键只允许有一个值。如果用已经存在的键调用 insert(),先前的值将被删除

qhash.insert(4,"10);

最后键为4的值将变成“10”。

3——取值;

//方式一

QString str1=qhash.value(1);//str1="1";

//方式二

QString str2=qhash[2];//str1="2";

如果qhash里面没有该键值,则返回默认构造值;比如:QString str3=qhash.value(5);//str3="";

4——检索某个值是否在里面

if(qhash.contains(9))

{

return false;

}

if(qhash.contains(1))

{

return true;

}

5——查找某个字并获取,一般推荐contains结合value重载函数来实现,

QString str;

if(qhash.contains(1))

{

str=qhash.value(1);

}

else

{

str=qhash.value(1,"wert");

//如果哈希表中不存在指定键的元素,该函数使用第2个参数作为默认值

}

而不是 operator 运算符查找哈希表中的键。原因是如果哈希表中不存在相同键的元素,operator 运算符会默默地将一个元素插入到哈希表中(除非哈希表是 const 的)

//错误

for (int i = 0; i 1000; ++i) {

if (qhash[i] == "789")

cout "Found value at index " i Qt::endl;

}

为了避免这个问题,将上面代码中的 hash[i] 替换为 hash.value(i),为什么这样可以,来我们来看看value的函数原型:const T value ( const Key key ) const ;const啊姐妹!

6——遍历 QHash 中存储的所有键值对

QHashint,QString::const_iterator it = qhash.constBegin();

while (it != qhash.constEnd()) {

cout it.key() ": " it.value() Qt::endl;

++i;

}

当然不用const_iterator也可以,直接iterator;

7——删除,下面两种都可以

qhash.erase(it);//这里的it是迭代器哦

qhash.remove(key);

QHash和QMap好像,我的天;但是它们两个还是有一定的区别的

QHash 的查找速度比 qmap 快。

遍历 qmap 时,元素总是按照键的顺序排好序的。而遍历 QHash时,元素的顺序是任意的。

qt关联容器关键字查找插入

平均最差平均最差

QMapKey, TO(log n)O(log n)O(log n)O(log n)

QHashKey, TAmort. O(1)O(n)Amort. O(1)O(n)

注: Amort.O(1)表示仅完成一次操作,可能会有O(n)行为;但是如果完成多次操作,如n次,平均结果是O(1)

QHash,QMap,QSet与QList(QStringList)浅析

关联容器 可以保存任意多个具有相同类型的项,且它们由一个键索引。Qt提供两个主要的关联容器类: QMapK, T 和 QHashK, T 。

QMapK, T 是一个以升序键顺序存储键值对的数据结构。这种排列使它可以提供良好的查找插入性能及键序的迭代。在内部, QMapK, T 是作为一个跳越列表(skip-list)来实现执行的。

在映射中插入项的一种简单方式是调用 insert() :

另外,也可以像下面一样,给一个指定的键赋值:

[] 操作符即可以用于插入也可以用于检索。如果在非常量映射中使用[]为一个不存在的键检索值,则会用给定的键和空值创建一个新的项。为了避免意外的创建空值,可以使用value()函数代替[]操作符来获得项。

如果键不存在,则利用值类型的默认构造函数,将返回一个默认值,同时不会创建新的项。对于基本类型和指针类型,将返回0值。我们可以指定另一默认值作为 value() 的第二个参数,例如:

这相当于:

QMapK, T的K和T数据类型可以是与int、double、指针类型、有默认构造函数的类、复制构造函数和赋值操作符相似的基本数据类型。此外,K类型必须提供 operator() ,因为QMapK, T要使用这个操作符以提升键序顺序存储项。

QMapK, T的K和T有一对方便的函数keys()和values(),它们在处理小数据集时显的特别有用。它们分别返回映射键的 QList 和映射值的QList。

映射通常都是单一值的:如果赋予一个现有的键一个新值,则原有的旧值将被该新值取代,以确保两个项不会共有同一个键。通过使用insertMulti()函数或者QMlltiMapK, T方便的子类,可以让多个键值对有相同的键。QMapK, T重载了value(const K ), 返回一个给定键多有值的QList列表。例如:

QHashK, T 是一个在哈希表中存储键值对的数据结构。它的接口几乎与QMapK, T相同,但是与QMapK, T相比,它对K的模板类型有不同的要求,而且它提供了比QMapK, T 更快查找功能 。

除了对存储在容器类中的所有值类型的一般要求,QHashK, T中K的值类型还需要提供一个 operator==() ,并需要一个能够为键返回哈希值的全局qHash()函数的支持。Qt已经为qHash()函数提供了对整型、指针型、QChar、QString以及QByteArr***。

QHashK, T为它内部的哈希表自动分配最初的存储区域,并在有项***入或者删除时重新划分所分配的存储区域的大小。也可以通过调用 reserve() 或者 squeeze() 来指定或者压缩希望存储到哈希表中的项的数目,以进行性能调整。通常的做法是利用我们预期的***的项的数目来条用reserve(),然后插入数据,最后如果有多出的项,则调用squeeze()以使内存的使用减到最小。

虽然哈希表通常都是单一值的,但是使用insertMulti()函数或者MultiHashK, T方便的子类,也可以将多个值赋给同一个键。

除了QHashK, T之外,Qt还提供了一个用来高速缓存与键相关联的对象的QCacheK, T类以及仅仅存储键的QSetK容器。在内部,它们都依赖于QHashK, T,且都像QHashK, T一样对K的类型有相同的要求。

最简便的遍历存储在关联容器中多有键值对的方式是使用Java风格的迭代器。因为迭代器必须能同时访问键和值,针对关联容器的Java风格的迭代器与连续容器的在运作方式有些差异。只要区别在于next()和previous()函数返回一个代表键值对的对象,而不是一个简单的值。我们可以使用key()和value()分别从这个对象中获得键和值。例如:

如果需要同时存取键和值,可以先忽略next()或previous()的返回值并使用迭代器的key()和value()函数,它们都是针对最后被跳过的项进行操作的:

QHash具有和QMap几乎完全一样的API,此类维护着一张哈希表,表的大小和数据项是自适应的,QHash是任意的顺序住址他的数据,当然他也支持一键多值(QMultiHash)QMap则是按顺序入住他的数据。

两者之间的区别是:

STL迭代器遍历(STL-style iterator)

如何QMap的遍历中,删除满足条件的元素

怎样才能从一个的QList删除元素,而使用foreach遍历

变量定义的一般形式为:

类型说明符 变量名标识符,变量名标识符,...;

例如:

int a,b,c; (a,b,c为整型变量)

long x,y; (x,y为长整型变量)

unsigned p,q; (p,q为无符号整型变量)

在书写变量定义时,应注意以下几点:

? 允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。

? 最后一个变量名之后必须以“;”号结尾。

? 变量定义必须放在变量使用之前。一般放在函数体的开头部分。

qmap遍历的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于map遍历key、qmap遍历的信息别忘了在本站进行查找喔。

发表评论
0评