Qt容器与常用算法

容器

这些容器的使用方式和stl学的基本结构,使用方式是一样

只要是数据就要使用容器,程序中的数据放在容器中方便增删改查。

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓  

Qt库提供了一组通用的基于模板的容器类(container classes)。这些容器类可以用来存储指定类型 的项目(items),例如,如果大家需要一个QString类型的可变大小的数组,那么可以使用 QVector(QString)。与STL(Standard Template Library,C++的标准模板库)中的容器类相比,Qt中的这 些容器类更轻量,更安全,更容易使用

遍历方式有很多中,主要讲使用STL风格进行遍历

STL风格迭代器兼容Qt和STL的通用算法(generic algorithms),而且在速度上进行了优化。对于每 一个容器类,都有两个STL风格迭代器类型:一个提供了只读访问,另一个提供了读写访问。因为只读 迭代器比读写迭代器要快很多,所以应尽可能使用只读迭代器。

STL风格迭代器的API模仿了数组的指针,例如,使用“++”操作符来向后移动迭代器使其指向下一个项 目;使用“*”操作符返回迭代器指向的项目等。STL风格迭代器是直接指向项目的。其中一个容器的 begin()函数返回了一个指向该容器中第一个项目的迭代器,end()函数也返回一个迭代器,但是这个迭代 器指向该容器的最后一个项目的下一个假想的虚项目,end()标志着一个无效的位置,当列表为空时, begin()函数等价于end()函数。

1、QList

QList是一个模板类,它提供了一个列表。QList实际上是一个T类型项目的指针数组,所以它支持基于索 引的访问,而且当项目的数目小于1000时,可以实现在列表中间进行快速的插入操作。

QList提供了很 多方便的接口函数 来操作列表中的项目,例如:

插入操作insert();替换操作replace();移除操作removeAt();移动操作move(); 交换操作swap();在表尾添加项目append();在表头添加项目prepend(); 移除第一个项目removeFirst();移除最后一个项目removeLast(); 从列表中移除一项并获取这个项目takeAt(),还有相应的takeFirst()和takeLast(); 获取一个项目的索引indexOf(); 判断是否含有相应的项目contains(); 获取一个项目出现的次数count()。

对于QList,可以使用“<<”操作符来向列表中插入项目,也可以使用“[ ]”操作符通过索引来访问一个项 目,其中项目是从0开始编号的。不过,对于只读的访问,另一种方法是使用at()函数,它比“[ ]”操作符 要快很多。

QList<QString> strList;
strList<<"AA"<<"BB"<<"CC"<<"DD";//放入4个字符串
QList<QString>::iterator i;//读写迭代器
for(i=strList.begin();i!=strList.end();i++)
{
	*i=i->toLower();//转小写
	qDebug()<<*i;//输出为小写的aa bb cc dd
}

while(i!=strList.begin())
{
	i--;
	qDebug()<<*i;//输出 dd cc bb aa
}

while(i!=strList.begin())
{
	i--;
	qDebug()<<*i;//输出 dd cc bb aa
}


//遍历方式
//1、for循环遍历
for(int i=0;i<strList.size();i++)
{
	qDebug()<<strList[i];
}
//2、foreach
foreach(QString itm,strList)
{
	qDebug()<<itm;
}
//3、只读迭代器
QListIterator<QString> it1(strList);
while(it1.hasNext())
{
	qDebug()<<it1.next();
}
//4、迭代器方式遍历
for(i=strList.begin();i!=strList.end();i++)
{
	*i=i->toLower();//转小写
	qDebug()<<*i;//输出为小写的aa bb cc dd
}



2、QLinkedList

基于迭代器访问的List,方便快速插入、删除

QLinkedList<int> list;
list<<1<<2<<3<<4<<5;
foreach(int i,list)
{
   qDebug()<<i;//1 2 3 4 5
}

3、QVectot

初始化:

QVector<int> v1(5); //开辟5个大小的空间
QVector<int> v2(5,1); //5个值,都是1
QVector<int> v3(v1); //用另一个QVector初始化

增加:

QVector<int> v;
push_back(5); //在数组后添加元素
push_front(4); //在数组首位置添加元素
prepend(3); //在数组首位置添加元素
append(6); //在数组最后添加元素
v << 7; //在数组最后添加元素,相当于尾插
insert(0,2); //在数组位置0,添加元素
insert(0,2,1); //在数组位置0,添加2个值为1的元素
insert(myVector.end(),8); //在数组最后,添加一个82
insert(myVector.end(),2,9); //在数组最后,添加2个值为9的元素

删除:

remove(0,2); //从位置0开始,移除2个元素
remove(0); //移除位置0的元素
pop_back(); //移除最后一个元素
pop_front(); //移除第一个元素
clear(); //清除所有元素
erase(myVector.begin());//移除某位置的元素
erase(myVector.begin(),myVector.end());//移除区间所有元素

改:

replace(0,10);//位置0上的元素,用10来代替

查找:

indexOf(2,0);//从位置0开始,查找元素2,返回下标
myVector.lastIndexOf(2,1);//从右向左数,位置0开始查找元素2,返回下标
myVector.startsWith(2);//判断,第一个元素是否是2
myVector.endsWith(2);//判断,最后一个元素是否是2

转换:

//将QVector转为std::Vector
std::vector<int> stdVector = myVector.toStdVector();

//将QVector转为QList
QList<int> list = myVector.toList();
qDebug() << list;

//将std::Vector转为QVector
myVector.clear();
myVector = QVector<int>::fromStdVector(stdVector);
qDebug() << myVector;

//将QList转为QVector
myVector.clear();
myVector = QVector<int>::fromList(list);
qDebug() << myVector;

一部分示例:

QVector<int> v;
v<<1<<2<<3<<66<<4<<5<<6;
v.insert(2,99);//在下标为2的位子插入一个99
qDebug()<<v;//全部输出
qDebug()<<v.indexOf(66,0);//从0开始查找66,返回下标

4、QMap

QMap类是一个容器类,它提供了一个基于跳跃列表的字典(a skip list based dictionary)。QMap是Qt 的通用容器类之一,它存储(键,值)对并提供了与键相关的值的快速查找。QMap中提供了很多方便 的接口函数,例如:

插入操作insert();

获取值value();

是否包含一个键contains();

删除一个键remove();

删除一个键并获取该键对应的值take();

清空操作clear();

插入一键多值insertMulti()。

可以使用“[ ]”操作符插入一个键值对或者获取一个键的值,不过当使用该操作符获取一个不存在的键的 值时,会默认向map中插入该键,为了避免这个情况,可以使用value()函数来获取键的值。当使用 value()函数时,如果指定的键不存在,那么默认会返回0,可以在使用该函数时提供参数来更改这个默 认返回的值。QMap默认是一个键对应一个值的,但是也可以使用insertMulti()进行一键多值的插入,对 于一键多值的情况,更方便的是使用QMap的子类QMultiMap。

QMap<QString,int> map;
map["one"] = 1; // 向map中插入("one",1)
map["three"] = 3;

map.insert("seven",7); // 使用insert()函数进行插入
// 获取键的值,使用“[ ]”操作符时,如果map中没有该键,那么会自动插入
int value1 = map["six"];
qDebug() << "value1:" << value1;
qDebug() << "contains 'six' ?" << map.contains("six");

// 使用value()函数获取键的值,这样当键不存在时不会自动插入
int value2 = map.value("five");
qDebug() << "value2:" << value2;
qDebug() << "contains 'five' ?" << map.contains("five");

// 当键不存在时,value()默认返回0,这里可以设定该值,比如这里设置为9
int value3 = map.value("nine",9);
qDebug() << "value3:" << value3;

QList<int>::const_iterator itm;
QMap<int,QString> Employees;
Employees.insert(1,"Bob");
Employees.insert(2,"Chad");
Employees.insert(3,"Mary");
Employees.insert(4,"oldWang");
Employees[5] = "rebote"; //不推荐这样赋值
QMap<int, QString>::const_iterator i = Employees.constBegin();
while (i != Employees.constEnd())
{
	std::cout << i.key() << ": " << i.value().toStdString()<<std::endl;
	++i;
}

QMap<int, QString>::iterator ii = Employees.begin();
while (ii != Employees.end()) 
{
	if(ii.value() == "oldWang")
	{
		ii.value() = "robort";
	}
	++i;
}

5、QHash

QMap与QHash的差别:

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

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

QHash的键类型Key必须提供operator==()和一个全局的qHash(Key)函数,而QMap的键类型Key必须提 供 operator<()函数。

QHash<int,QString> Employees;
Employees.insert(2,"Bob");
Employees.insert(1,"Chad");
Employees.insert(3,"Mary");
foreach(int i, Employees.keys())
{
	qDebug() << Employees[i];
}

QHashIterator<int,QString> Iter(Employees);
while(Iter.hasNext())
{
	Iter.next();
	qDebug() << Iter.key() << " = " << Iter.value();
}

常用算法

在头文件中,Qt提供了一些全局的模板函数,这些函数是可以使用在容器上的十分常用的算法。我们可 以在任何提供了STL风格迭代器的容器类上使用这些算法,包括QList、QLinkedList、QVector、QMap 和QHash。

1、qsort

bool fun(int a,int b)
{
	return a>b;
}
//类似stl中sort用法

QList<int> list;
list << 36 << 16 << 66 << 6 << 56;
qSort(list.begin(), list.end());//小到大
qDebug()<<list;
qSort(list.begin(), list.end(),fun);//大到小,多一个参数,比较方式
qDebug()<<list;

2、qcopy

QStringList list;
list << "a" << "b" << "c";

QVector<QString> vect(3);
//第一个参数:拷贝起始点,第二个参数:拷贝终止点,第三个参数:拷贝到哪里
qCopy(list.begin(), list.end(), vect.begin());
foreach (QString item, vect)
{
	qDebug() << item;
}

3、qFind

QList<QString> list;
list<<"qwq"<<"ewrw"<<"e";

//在list中查找"e"是否存在
//第一个参数:查找起始点,第二个参数:查找终止点,第三个参数:查找什么值
QList<QString>::const_iterator iter=qFind(list.begin(),list.end(),"e");
if(iter!=list.end())
{
	qDebug()<<*iter;
}
else
{
	qDebug()<<"not fond";
}

文章转自博客园(宣哲):qt容器与常用算法 - 宣哲 - 博客园

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓ 

猜你喜欢

转载自blog.csdn.net/QtCompany/article/details/132119453