一、介绍
std中有几个常用的容器:vector、List、set、map,Qt中也封装了类似的容器。Qt 的容器类提供了隐式数据共享、不可变的特性,并且为速度做了优化,具有较低的内存占用量等 。
二、QVector
1、添加元素
QVector<int> intVec;
intVec.append(10);
intVec << 11 << 12;
intVec.push_back(13);
intVec.push_front(9);
intVec.insert(2, 20);
//9 10 20 11 12 13
2、遍历元素
QVector<int>::iterator iter;
for(iter = intVec.begin(); iter != intVec.end(); iter++)
{
qDebug() << *iter;//9 10 20 11 12 13
}
3、删除元素
intVec.remove(1);//删除第1个元素,从0开始
intVec.remove(1, 3);//删除从第1个元素开始的3个元素
intVec.removeFirst();//删除首元素
intVec.removeLast();//删除最后一个元素
intVec.removeAll(2);//删除所有与2相等的元素
4、查询元素
intVec.contains(3);//查询vector中是否包含该值的元素
5、性能
(1)QVector插入元素insert会很慢,因为内存中移动一个位置,这会引起大量数据在内存中的移动 ,中间插入使用QList会比较快
(2)at()比operator读取速度快,因为这个不会使用深拷贝
(3)使用reserve()预先分配一定的内存大小空间,避免所需空间大于默认分配空间,造成内存多次分配
二、QList
1、添加删除元素
QList<QString> list;
list << "a" << "b";//左操作符进行追加元素
list.append("c");
list.insert(2, "we"); //在第2个元素位置插入元素
list.push_back("dd"); //尾插法
list.removeAt(2); //删除第2个元素
2、遍历元素
QList<QString>::iterator iter;
int index = 0;
for(iter = list.begin(); iter != list.end(); iter++, index++)
{
qDebug() << *iter << list.at(index) << list[index];//可以使用索引或迭代器,上同
}
// "a" "a" "a"
// "b" "b" "b"
// "c" "c" "c"
// "dd" "dd" "dd"
三、QSet
QSet类是一个模板类,他是一个哈希表集合。
QSet是Qt的一个普通容器类。QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能
1、操作元素
QSet<int> setInt;
setInt.insert(1);
setInt.insert(2);
setInt << 3 << 4 << 5 << 5;
setInt.contains(2); //查询是否有3
qDebug() << setInt.size(); //5,重复的自动去掉
2、遍历元素
QSet<int>::iterator iter;
for(iter = setInt.begin(); iter != setInt.end(); iter++)
{
qDebug() << *iter;//1 4 5 2 3
}
四、QMap
QMap<Key, T>:提供了字典数据结构(关联数组),将类型 T 的值同类型 Key 的
键关联起来。通常,每个键与一个值关联。 QMap 以键的顺序存储数据;如果顺序无
关, QHash 提供了更好的性能,类似的,QMultiMap<Key, T>:这是 QMap 的子类,提供了多值映射
1、基本使用
QMap<int , QString> mapInt;
mapInt.insert(2,"aaa");
mapInt[3] = "bbb"; //也可以这种方式插入数据
bool isCtn = mapInt.contains(2);//是否包含该键值 isCtn = true
QString str = mapInt[2];//根据键,取出对应的值 str = "aaa"
2、遍历容器
QMap<int,QString>::iterator it; //遍历map
for ( it = mapInt.begin(); it != mapInt.end(); ++it )
{
qDebug( "%d: %s", it.key(), it.value()); //用key() value()分别获取“键”和“值”
}
上述遍历方式,我都只采用类std遍历方式,还有其他几种方式,如java风格的iter.hasNext,qt特有的foreach关键字进行遍历,各人的喜好不一样,可以根据自己的代码风格来选用其中一种