QVector_QMap
QVector简介
头文件:#include<QVector>
模块: QT += core
功能: QVector类是动态数组的模板类,顺序容器,它将自己的每一个对象存储在连续的内存中,可以使用索引号来快速访问它们
常用接口
判断容器是否为空
bool QVector::isEmpty() const:如果容器为空返回true
QVector<int> v; qDebug() << v.isEmpty(); |
查询元素个数
count() 、size() 、length()
QVector<int> v; v << 1 << 2 << 3; qDebug() << v.size(); qDebug() << v.length(); qDebug() << v.count(); |
获取vector客观容量
int capacity() const //返回可以存储在vector中而不强制重新分配的最大项数
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); v.replace(2, 3); v << 1 << 1 << 1; qDebug() << v.capacity(); |
访问数据
下标方式访问
QVector<int> v; v << 1 << 2 << 3; qDebug() << v.at(0); qDebug() << v[0]; |
迭代器方式访问
QVector<int> v; v << 1 << 2 << 3;
QVector<int>::iterator it = v.begin(); for(;it!= v.end(); it++) { qDebug() << *it; } |
添加数据
在尾部添加数据
void append(const T &value)
void append(const QVector<T> &value)
void push_back(const T &value)
QVector<int> v; v.append(1);
QVector<int> v1 = {2, 3}; v.append(v1); v.push_back(4); qDebug() << v; |
在头部添加数据
void prepend(const T &value)
void push_front(const T &value)
QVector<int> v; v.prepend(1); v.push_front(2); qDebug() << v; |
在任意位置添加数据
void insert(int i, const T &value) //将元素插入到i位置,i从0开始计算
void insert(int i, int count, const T &value) //从i位置开始插入count个T &value类型元素
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); qDebug() << v; |
修改数据
void replace(int i, const T &value) //改变i位置元素的值
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); v.replace(2, 3); qDebug() << v; |
查找元素位置
int indexOf(const T &value, int from=...) const //返回 value在vector中第一次出现的位置
参数form含义:如果指定则从索引from开始向前搜索
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); v.replace(2, 3); qDebug() << v.indexOf(1); |
int QVector::lastIndexOf(const T &value, int from = ...) const //返回 value在vector中最后一次出现的位置
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); v.replace(2, 3); v << 1 << 1 << 1; qDebug() << v.lastIndexOf(1); |
判断容器是否包含某元素
bool QVector::contains(const T &value) const //如果vector包含value则返回true
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); v.replace(2, 3); v << 1 << 1 << 1; qDebug() << v.contains(1); |
bool QVector::endsWith(const T &value) const //如果vector最后一个元素等于value则返回true
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); v.replace(2, 3); v << 1 << 1 << 1; qDebug() << v.endsWith(1); |
bool QVector::startsWith(const T &value) const //如果vector第一个元素等于value则返回true
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); v.replace(2, 3); v << 1 << 1 << 1; qDebug() << v.startsWith(1); |
截取链表
QVector<T> QVector::mid(int pos, int length = ...) const //返回一个子容器,其中包含该容器中的元素,从位置pos开始。如果length为-1,则包含pos之后的所有元素;否则包含长度元素(如果链表长度小于长度元素,则包含所有剩余元素)
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); v.replace(2, 3); v << 1 << 1 << 1; qDebug() << v.mid(0); qDebug() << v.mid(1, 2); |
删除数据
void remove(int i, int count) //从vector中移除从 i开始的count个元素
void pop_back() //删除vector中最后一个元素
void pop_front() //删除vector中第一个元素
QVector<int> v; v.insert(0, 1); v.insert(1, 2, 2); v.replace(2, 3); v << 1 << 1 << 1; v.remove(0); qDebug() << v; v.remove(1, 3); qDebug() << v; |
QVector应用
QMap简介
头文件:#include<QMap>
模块: QT += core
功能:QMap存储(键、值)对,并提供与键相关联的值的快速查找,基于红黑树实现(std::map也是基于红黑树实现)
QMap和 QHash差异:
(1)QHash的查找速度比QMap要快
(2)当在QHash上迭代时,项的顺序是任意的。使用QMap,项目总是按键排序
(3)QHash的键类型必须提供operator==() 和全局qHash(Key) 函数。QMap的键类型必须提供operator<(),以指定全序顺序。从Qt 5.8.1开始,使用指针类型作为键也是安全的,即使底层operator<()不提供全序顺序。
常用接口
判断容器是否为空
bool QMap::isEmpty() const:判断容器是否为空
QMap<int, QString> m; qDebug() << m.isEmpty(); |
查询元素个数
count() 、size() //没有length函数
QMap<int, QString> m; m[0] = "one"; m[1] = "two"; qDebug() << m.size(); qDebug() << m.count(); |
访问数据
通过key访问value
QMap<int, QString> m; m[0] = "one"; m[1] = "two"; qDebug() << m[0]; qDebug() << m.value(1); |
插入数据
可以用运算符[ ]插入一对 (key,value) 到QMap对象中
QMap<int, QString> m; m[0] = "one"; m[1] = "two"; qDebug() << m; |
QMap::iterator QMap::insert(const Key &key, const T &value):插入一个带有键key和值value的新项
如果已经存在键为key的项,则该项的值将替换为value
如果有多个键为key的项,则最近插入的项的值将替换为value
QMap<int, QString> m; m[0] = "one"; m[1] = "two"; m.insert(2, "three"); qDebug() << m; |
QMap::iterator QMap::insertMulti(const Key &key, const T &value):插入一个带有键key和值value的新项。
如果映射中已经存在具有相同键的项,则该函数将简单地创建一个新项。(此行为不同于insert(),后者覆盖现有项的值)
QMap<int, QString> m; m[0] = "one"; m[1] = "two"; m.insert(2, "three"); qDebug() << m;
m.insertMulti(2, "four"); qDebug() << m; |
修改数据
可以直接通过key访问对应value进行修改
QMap<int, QString> m; m[0] = "one"; m[1] = "two"; m[0] = "three"; qDebug() << m; |
获取对应key的迭代器
QMap::iterator QMap::find(const Key &key):返回一个迭代器,该迭代器指向map中键为key的项
如果map包含多个传入键的项,则此函数返回一个迭代器,该迭代器指向最近插入的项。其他值可以通过对迭代器自增来访问
QMap<int, QString> m; m[0] = "one"; m[1] = "two"; QMap<int, QString>::iterator it = m.find(1); qDebug() << *it; |
查看QMap中是否包含某一元素
bool QMap::contains(const Key &key) const:如果map包含键为key的项,则返回true;否则返回false。
QMap<int, QString> m; m[0] = "one"; m[1] = "two"; qDebug() << m.contains(0); |
删除数据
int QMap::remove(const Key &key):从map中删除所有带有key的项目。返回删除的项数,通常为1,但如果键不在map中则为0,或者如果已对键使用insertMulti()则为 >1
QMap<int, QString> m; m[0] = "one"; m[1] = "two"; m.insertMulti(0, "three"); qDebug() << m.remove(0); qDebug() << m; |
QMap应用
employee.h |
#ifndef EMPLOYEE_H #define EMPLOYEE_H
#include <QDebug>
class Human { public: Human(){} Human(const int age): age(age) { }
private: int age;
friend inline QDebug operator<<(QDebug debug, const Human& h); friend inline bool operator<(const Human& h1, const Human& h2); };
inline QDebug operator<<(QDebug debug, const Human& h) { return (debug << h.age); }
inline bool operator<(const Human& h1, const Human& h2) { return h1.age < h2.age; }
#endif // EMPLOYEE_H |
Human h1(22); Human h2(18);
QMap<Human, QString> m; m[h1] = "小王"; m[h2] = "小张";
qDebug() << m; |