首页 > 编程知识 正文

数据结构折半查找,数据结构后序遍历

时间:2023-05-03 12:38:33 阅读:36869 作者:4910

迭代器

QT支持两种类型的迭代器: const_iterator

迭代器:迭代器

只读迭代器的工作速度比读/写迭代器快很多

一. q列表

概念:提供列表的模板类//函数:

插入(; //指定在索引中插入值

替换(; //指定索引的替换值

append (; //追赶

prepend (; //追赶头

at ) )获得://索引索引的值

计数(; //返回某个元素的个数

contains (; //判断是否含有某种元素。 返回值:布尔值

swap (;//交换两个索引对应的值。 参数:1.索引12 .索引2

索引of (; //获取与参数1对应的元素的索引,参数2 :从哪里查找(可默认)

移动At (; //删除索引值

移除第一个(; //删除第一个元素

移除lat (; //删除最后一个元素

移除全部(; //从参数中删除对应的元素(删除全部) ) ) )。

移除(; 移动//元素。 参数:1.起始索引2 .目标索引

//将元素从开始索引移动到目标索引时,其他元素会相应地发生变化() (向前或向前) )。

takeAt (; //删除与索引对应的要素,得到该要素

takeFirst (;

takeLast (;

常见操作

通过列表;

list12345;

遍历元素

使用for、foreach、迭代器QListlist;

q list :3360 const _ iterator ite; //定义只读迭代器

list12345;

for(ite=list.Begin ); ite!=list.end (; ite )

{

q调试() )

}

Foreach(Intitem,list ) )。

{

q调试() )

}

for(inti=0; I

{

q调试() )

}

二. QLinkedList

概念:提供链接列表的模板类

三. q向量机

概念:提供动态数组的模板类

四. QMap

概念:提供基于跳转列表的词典//函数:

插入(; //插入元素()推荐)。 参数:1.key2.value

value (; //key值v获得value,不返回0

take (; 删除一个//key,获取与该key对应的值

clear (; //清除所有元素

contains (; //判断对应的key值是否存在,返回:布尔值

1 .常见操作

使用[]取与key对应的值时,如果此key不存在,则返回0、NULL .等,并添加此key值QMapmap;

map['one']=1;

intvalue1=map['two'];

q调试() )

2 .遍历元素

迭代器,foreachQMapmap;

qmap : const _ iterator ite;

map.insert('one ',1 );

map.insert('two ',2 );

for(ite=map.constbegin ); ite!=map.constEnd (; ite )

{

q调试() )

}

通过遍历foreach(qstringitem,map.keys ) ) keys列表

{

q调试() )

}

3 .查找if (myqmap.contains ) (mykey ) ) )。

myValue=myQMap['mykey'];

}autoit=myqmap.find(mykey );

if(it!=myQMap.end () }

myValue=it.value (;

}

4 .演示代码

基本的APP应用演示

以“键-值”全部为QString的例子说明QMap的基本使用方法。 #包含

#includ

using namespace std;

class MapTest

{

public:

void showMap()

{

if (!m_map.isEmpty()) return;//判断map是否为空

m_map.insert("111", "aaa");//向map里添加一对“键-值”

if (!m_map.contains("222"))//判断map里是否已经包含某“键-值”

m_map.insert("222", "bbb");

m_map["333"] = "ccc";//另一种添加的方式

qDebug() <

if (m_map.contains("111")){

QMap::iterator it = m_map.find("111"); //找到特定的“键-值”对

qDebug() <

}

cout <

qDebug() <

cout <

QMap::iterator it; //遍历map

for (it = m_map.begin(); it != m_map.end(); ++it) {

qDebug() <

}

}

m_map.clear(); //清空map

}

private:

QMap m_map; //定义一个QMap对象

};

调用类函数showMap(),显示结果:map[333] , value is : ccc

find 111 , value is : aaa

size of this map is : 3

111: aaa

222: bbb

333: ccc

对象的使用map当中还可以保存类对象、自己定义类对象,例子如下(摘自QT帮助文档《Qt Assistant》,更详细的说明参考之):以注释形式说明#include 

#include 

#include 

//自定义一个Employee类,包含fn、sn、sal属性

class Employee

{

public:

Employee(): sn(0) {}

Employee( const QString& forename, const QString& surname, int salary )

: fn(forename), sn(surname), sal(salary)

{ }

QString forename() const { return fn; }

QString surname() const { return sn; }

int salary() const { return sal; }

void setSalary( int salary ) { sal = salary; }

private:

QString fn;

QString sn;

int sal;

};

int main(int argc, char **argv)

{

QApplication app( argc, argv );

typedef QMap EmployeeMap; //自定义一个map类型,值为EmployeeMap对象

EmployeeMap map;

map["JD001"] = Employee("John", "Doe", 50000); //向map里插入键-值

map["JW002"] = Employee("大气的仙人掌", "Williams", 80000);

map["TJ001"] = Employee("Tom", "Jones", 60000);

Employee mmdy( "伶俐的路人", "Hind", 50000 );

map["SH001"] = mmdy;

mmdy.setSalary( 40000 ); //修改map值的内容,因为map采用值传递,所以无效

//批量打印

EmployeeMap::Iterator it;

for ( it = map.begin(); it != map.end(); ++it ) {

printf( "%s: %s, %s earns %dn",

it.key().latin1(),

it.data().surname().latin1(),

it.data().forename().latin1(),

it.data().salary() );

}

return 0;

}Program output:

JD001: Doe, John earns 50000

JW002: Williams, 大气的仙人掌 earns 80000

SH001: Hind, 伶俐的路人 earns 50000

TJ001: Jones, Tom earns 60000

5. 要注意的问题

(1)最近一个项目中使用了别人的接口程序,维护代码时发现定义的一个QMap对象总是无缘无故的多出数据,找遍程序也没发现哪里显式插入数据,后来发现原来是使用QMap::[key]操作符取value时,如果所传key在map里不存在的话,map会自动插入一条默认数据。。。这个悲催的问题浪费了我几个小时的时间。。特意写下来,提醒自己。

(2)查找的时候应该这么写:找到了再调用if(map.contains("22222")){

qDebug() <

}

五、QHash

概念:一个模板类,它提供基于哈希表的字典

QMap与QHash的差别:

QHash具有比QMap更快的查找速度

QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据

六、容器常用算法

一、qSort

排序,默认为升序,第二个参数:qGreater()逆序QList list;

list <

qSort(list.begin(), list.end());  //升序

qSort(list.begin(), list.end(),qGreater()); //逆序

二、qCopy

拷贝,要注意有足够的空间存储拷贝内容QStringList list;

list <

QVector vect(5);

qCopy(list.begin(), list.end(), vect.begin()+1);

foreach (QString item, vect)

{

qDebug() <

}

//vect:["","a","b","c",""]

三、查找(qFind、find)

QList查找,qFinfQList List;

List <

QList::const_iterator Iter = qFind(List.begin(), List.end(), 25);

if(Iter != List.end())

{

qDebug() <

}

else

{

qDebug() <

}

QMap查找,find只能找到其key值,而不是value值QMap map;

map.insert(1,"a");

map.insert(2,"b");

QMap::const_iterator Iter=map.find(1);

while(Iter!=map.end()&&Iter.key()==1)

{

qDebug()<

}

————————————————

版权声明:本文为CSDN博主「江南、dldxrz」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。