Qt 教程二(三)
7,container
Qt中提供了一组通用的基于模板的容器类(container class)。可以用来存储指定的项(items),与STL(C++标准模板库)相比,Qt中的容器更轻量,更安全,功能更强大。
序列式容器
QList
QLinkedList
QVector
QStack
QQueue
对于大多数应用程序,QList是最好的类型。虽然它是作为数组列表实现的,但是它提供了非常快的前置和附加。如果你真的需要一个链表,使用QLinkedList;如果您希望您的项目占用连续的内存位置,请使用QVector。QStack和QQueue是提供LIFO和FIFO语义的便利类。
关联式容器
QMap
QMultiMap
QHash
QMultiHash
QSet
“multi”容器方便地支持与单个键相关联的多个值。“hash”容器通过使用哈希函数而不是对排序集进行二进制搜索,从而提供更快的查找。
作为特殊情况,QCache和QContiguousCache类在有限的缓存存储中提供了对象的高效散列查找。
遍历容器
Qt提供了两种遍历容器的风格:
java风格的迭代器和stl风格的迭代器。java风格的迭代器更容易使用并提供高级功能,而STL风格的迭代器稍微更高效,可以与Qt和STL的通用算法一起使用。
java风格
STL风格
QList<int> list; list<<1<<2<<3<<4<<5; QListIterator<int> it(list); while (it.hasNext()) { qDebug()<<it.next(); }
QT中的 容器(container)
使用QContiguousCache管理内存
三十七、Qt缓存之QCache
序列式容器
QList
QList模板提供了一个列表,实际上是一个指针数组,当项目数小于1000时,可以实现快速的插入删除操作
QList 是 Qt 的通用容器类之一。它将项目存储在一个列表中,该列表提供基于索引的快速访问和基于索引的插入和删除。
QList、QLinkedList 和 QVector 提供类似的 API 和功能。它们通常可以互换,但会产生性能后果。
使用概述:
QVector 应该是您的默认首选。 QVector 通常会比 QList 提供更好的性能,因为 QVector 总是将其项按顺序存储在内存中,其中 QList 将在堆上分配它的项,除非 sizeof(T) <= sizeof(void *) 并且 T 已使用 Q_DECLARE_TYPEINFO 声明为 Q_MOVABLE_TYPE 或 Q_PRIMITIVE_TYPE。
然而,QList 在整个 Qt API 被大量使用,用于传递参数和返回值。 使用 QList可以很方便的与这些 API 进行交互。
如果您需要一个真正的链表,它保证常量时间内插入列表,并且使用迭代器指向项而不是索引,那么请使用QLinkedList。
公有函数
添加数据
//支持流插入 QList<int>()<<1<<2<<3<<4<<5; void append(const T &value) void append(const QList<T> &value) void insert(int i, const T &value) QList::iterator insert(QList::iterator before, const T &value) void prepend(const T &value) void push_back(const T &value) void push_front(const T &value)
获取数据
T &back() const T &back() const T &first() const T &first() const T &front() const T &front() const T &last() const T &last() const const T &constFirst() const const T &constLast() const //返回下标为i的元素,如果下标i不合法,则返回defaultValue T value(int i) const T value(int i, const T &defaultValue) const const T &at(int i) const T &operator[](int i) const T &operator[](int i) const //返回从位置pos开始的子列表。如果length为-1(默认),则包含pos中的所有元素; QList<T> mid(int pos, int length = -1) const
删除数据
void clear() QList::iterator erase(QList::iterator pos) QList::iterator erase(QList::iterator begin, QList::iterator end) void pop_back() void pop_front() //删除元素 int removeAll(const T &value) bool removeOne(const T &value) void removeAt(int i) void removeFirst() void removeLast() //删除元素并返回它,如果不使用返回值,removeAt()会更高效 T takeAt(int i) T takeFirst() T takeLast()
查找/替换
//返回value在列表中第一次出现的索引位置,从索引位置from向前搜索。 如果没有匹配的项,则返回-1。 int indexOf(const T &value, int from = 0) const //返回value在列表中最后一次出现的索引位置,从索引位置from反向搜索。如果from是-1(默认值),则搜索从最后一项开始。如果没有匹配的项,则返回-1。 int lastIndexOf(const T &value, int from = -1) const //将索引位置为i的项替换为value void replace(int i, const T &value) //如果列表中包含值的出现,则返回true; 否则返回false。 该函数要求值类型具有operator==()的实现。 bool contains(const T &value) const
交换/移动
//将索引位置from到索引位置to //["A", "B", "C", "D", "E", "F"] move(1,4)-> ["A", "C", "D", "E", "B", "F"] void move(int from, int to) void swap(QList<T> &other) //交换下标i j的元素 void swapItemsAt(int i, int j)
判断函数
int count(const T &value) const int count() const int size() const int length() const bool empty() const bool isEmpty() const //如果列表第一项/后一项等于value,则返回true; 否则返回false。 bool startsWith(const T &value) const bool endsWith(const T &value) const //预分配空间大小 void reserve(int alloc)
和其他容器互转
QSet<T> toSet() const std::list<T> toStdList() const QVector<T> toVector() const [static] QList<T> fromSet(const QSet<T> &set) [static] QList<T> fromStdList(const std::list<T> &list) [static] QList<T> fromVector(const QVector<T> &vector)
QStringList
QStringList继承自QList。 它提供基于索引的快速访问以及快速插入和删除。 将字符串列表作为值参数传递既快速又安全。
QList的所有功能也适用于QStringList。 例如,可以使用isEmpty()来测试列表是否为空,还可以调用append()、prepend()、insert()、replace()、removeAll()、removeAt()、removeFirst()、removeLast()和removeOne()等函数来修改QStringList。 此外,QStringList提供了一些方便的函数,使处理字符串列表更容易:
判断是否包含某个字符串
bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const bool contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
过滤:返回包含子字符串str的所有字符串的列表
QStringList filter(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const QStringList filter(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const QStringList filter(const QRegExp &rx) const QStringList filter(const QRegularExpression &re) const
查找
//从左往右查找 int indexOf(const QRegExp &rx, int from = 0) const int indexOf(QStringView str, int from = 0) const int indexOf(QLatin1String str, int from = 0) const int indexOf(QRegExp &rx, int from = 0) const int indexOf(const QRegularExpression &re, int from = 0) const //从右往左查找 int lastIndexOf(const QRegExp &rx, int from = -1) const int lastIndexOf(QStringView str, int from = -1) const int lastIndexOf(QLatin1String str, int from = -1) const int lastIndexOf(QRegExp &rx, int from = -1) const int lastIndexOf(const QRegularExpression &re, int from = -1) const
连接:将QStringList中的所有字符串连接为一个字符串,每个元素由给定的分隔符(可以是空串)分隔。
//支持流插入 << QString join(const QString &separator) const QString join(QStringView separator) const QString join(QLatin1String separator) const QString join(QChar separator) const
- 删除:从QStringList中删除重复的元素。 返回已删除元素的数量。
int removeDuplicates()
替换:返回一个字符串列表,其中每个字符串在找到before文本时都将before文本替换为after文本
QStringList &replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) QStringList &replaceInStrings(QStringView before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive) QStringList &replaceInStrings(const QString &before, QStringView after, Qt::CaseSensitivity cs = Qt::CaseSensitive) QStringList &replaceInStrings(QStringView before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive) QStringList &replaceInStrings(const QRegExp &rx, const QString &after) QStringList &replaceInStrings(const QRegularExpression &re, const QString &after)
- 排序:升序
void sort(Qt::CaseSensitivity cs = Qt::CaseSensitive)
QLinkedList
单链表
QVector
//返回vector底层数组指针。只要不重新分配vector对象,指针就保持有效。 这个函数在将vector传递给接受普通c++数组的函数时非常有用。 T *data() const T *data() const //将value赋给向量中的所有项。 如果size不同于-1(默认值),则vector的大小将被调整为size之前的大小。 QVector<T> &fill(const T &value, int size = -1)
QStack
T pop() void push(const T &t) void swap(QStack<T> &other) T &top() const T &top() const
//删除队头并返回它 T dequeue() //将值t加到队尾 void enqueue(const T &t) //返回队头的引用 T &head() const T &head() const void swap(QQueue<T> &other)
关联式容器
QMap
QMap<Key, T> 是 Qt 的通用容器类之一。 它存储(键,值)对,并提供与键关联的值的快速查找。
QMap 和 QHash 提供非常相似的功能。 区别在于:
QHash 提供比 QMap 更快的平均查找速度。
在迭代 QHash 时,项目是任意排序的。 使用 QMap,项目总是按键排序。
QHash 的键类型必须提供 operator==() 和全局 qHash(Key) 函数。 QMap 的键类型必须提供 operator<() 指定总顺序。 从 Qt 5.8.1 开始,使用指针类型作为键也是安全的,即使底层 operator<() 不提供全序。
公有函数
添加数据
//插入新的键值对,如果已经有一个键为key的项,则该项的值将被value替换;如果有多个键为key的项,则最近插入的项的值将被value替换。 QMap::iterator insert(const Key &key, const T &value) QMap::iterator insert(QMap::const_iterator pos, const Key &key, const T &value) //插入新的键值对,如果在map中已经有一个具有相同键的项,这个函数将创建一个新的项 QMap::iterator insertMulti(const Key &key, const T &value) QMap::iterator insertMulti(QMap::const_iterator pos, const Key &key, const T &value)
获取数据
T &first() const T &first() const const Key &firstKey() const const Key key(const T &value, const Key &defaultKey = Key()) const QList<Key> keys() const QList<Key> keys(const T &value) const T &last() const T &last() const const Key &lastKey() const //返回一个列表,该列表包含映射中的所有键。 在映射中出现多次的键在返回的列表中只出现一次。 QList<Key> uniqueKeys() const //将其他map中的所有项目插入到该map中。 QMap<Key, T> &unite(const QMap<Key, T> &other) const T value(const Key &key, const T &defaultValue = T()) const QList<T> values() const QList<T> values(const Key &key) const T &operator[](const Key &key) const T operator[](const Key &key) const
删除数据
void clear() QMap::iterator erase(QMap::iterator pos) int remove(const Key &key) T take(const Key &key)
查找
bool contains(const Key &key) const /* 返回两个迭代器 迭代器1:是指向当前 map 容器中第一个大于或等于 key 的键值对的迭代器(lowerBound())。 迭代器2:是指向当前 map 容器中第一个大于 key 的键值对的迭代器。(upperBound()) */ QPair<QMap::iterator, QMap::iterator> equal_range(const Key &key) QPair<QMap::const_iterator, QMap::const_iterator> equal_range(const Key &key) const QMap::iterator find(const Key &key) QMap::const_iterator find(const Key &key) const QMap::iterator lowerBound(const Key &key) QMap::const_iterator lowerBound(const Key &key) const QMap::iterator upperBound(const Key &key) QMap::const_iterator upperBound(const Key &key) const
判断
int count(const Key &key) const int count() const int size() const bool empty() const bool isEmpty() const
QMultiMap
插入和替换:插入新的键值对。
如果已经有一个键为key的项,则该项的值将被value替换。
如果有多个键为key的项,则最近插入的项的值将被value替换。
typename QMap<Key, T>::iterator replace(const Key &key, const T &value)
QHash
- 添加数据
QHash::iterator insert(const Key &key, const T &value) QHash::iterator insertMulti(const Key &key, const T &value)
获取数据
const Key key(const T &value) const const Key key(const T &value, const Key &defaultKey) const QList<Key> keys() const QList<Key> keys(const T &value) const QList<Key> uniqueKeys() const QHash<K, V> &unite(const QHash<K, V> &other) const T value(const Key &key) const const T value(const Key &key, const T &defaultValue) const QList<T> values() const QList<T> values(const Key &key) const
删除数据
void clear() QHash::iterator erase(QHash::const_iterator pos) QHash::iterator erase(QHash::iterator pos) QPair<QHash::iterator, QHash::iterator> equal_range(const Key &key) QPair<QHash::const_iterator, QHash::const_iterator> equal_range(const Key &key) const int remove(const Key &key) T take(const Key &key)
查找
bool contains(const Key &key) const QHash::iterator find(const Key &key) QHash::const_iterator find(const Key &key) const
判断
int count(const Key &key) const int count() const int size() const bool empty() const
QMultiHash
继承自QHash
typename QHash<Key, T>::iterator replace(const Key &key, const T &value)
案例
class Grade //班级 { public: Grade(int number, const QString& GradeName) :number(number),name(GradeName) {} friend QDebug operator<<(QDebug out, const Grade& stu); friend bool operator==(const Grade& left, const Grade& right); friend uint qHash(const Grade& stu, uint seed = 0); private: int number; //班级号 QString name; }; QDebug operator<<(QDebug out, const Grade& stu) { out << "[" << stu.number <<"," << stu.name << "]"; return out; } bool operator==(const Grade& left, const Grade& right) { return (left.number == right.number); } uint qHash(const Grade& stu, uint seed) { return stu.number; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QHash<Grade, QString> hash; hash.insert(Grade(1403, "安卓"), "张三"); hash.insert(Grade(1406, "苹果"), "李四"); qDebug() << hash; return a.exec(); }
QSet
- 添加数据
QSet::iterator insert(const T &value)
- 获取数据
QList<T> values() const QList<T> toList() const
删除数据
void clear() QSet::iterator erase(QSet::const_iterator pos) QSet::iterator erase(QSet::iterator pos) bool remove(const T &value)
查找
bool contains(const T &value) const bool contains(const QSet<T> &other) const QSet::const_iterator find(const T &value) const QSet::iterator find(const T &value)
- 其他
int count() const bool empty() const bool isEmpty() const int size() const
交集,差集,并集
//并集:ohter集合中不在这个集合中的每一项都被插入到这个集合中。 返回对该集合的引用。 QSet<T> &unite(const QSet<T> &other) //差集:从该集合中删除包含在ohter集合中的所有项。 返回对该集合的引用。 QSet<T> &QSet::subtract(const QSet<T> &other) //交集:从该集合中删除ohter集合中不包含的所有项。 返回对该集合的引用。 QSet<T> &intersect(const QSet<T> &other) //如果该集合与ohter集合至少有一个共同项,则返回true。 bool intersects(const QSet<T> &other) const
8,算法
直接使用STL中的算法
QtGlobal
Qt类的头文件都会包含该头文件,所以不用再显式定义了
T qAbs(const T &t) //求绝对值 //返回value限定在min至max范围之内的值 const T &qBound(const T &min, const T &val, const T &max) //如果p1和p2近似相等,返回true bool qFuzzyCompare(double p1, double p2) bool qFuzzyCompare(float p1, float p2) //如果浮点数约等于0,返回true bool qFuzzyIsNull(double d) bool qFuzzyIsNull(float f) //返回无穷大的数 double qInf() //求最大值和最小值 const T &qMax(const T &a, const T &b) const T &qMin(const T &a, const T &b) //四舍五入到最近的整数 qint64 qRound64(double d) qint64 qRound64(float d) int qRound(double d) int qRound(float d) //获得Qt版本 const char *qVersion()
QtMath
常用函数
qreal qAcos(qreal v) qreal qAsin(qreal v) qreal qAtan2(qreal y, qreal x) qreal qAtan(qreal v) int qCeil(qreal v) qreal qCos(qreal v) //角度转弧度 float qDegreesToRadians(float degrees) double qDegreesToRadians(double degrees) qreal qExp(qreal v) qreal qFabs(qreal v) int qFloor(qreal v) qreal qLn(qreal v) quint32 qNextPowerOfTwo(quint32 value) quint64 qNextPowerOfTwo(quint64 value) quint32 qNextPowerOfTwo(qint32 value) quint64 qNextPowerOfTwo(qint64 value) qreal qPow(qreal x, qreal y) float qRadiansToDegrees(float radians) double qRadiansToDegrees(double radians) qreal qSin(qreal v) qreal qSqrt(qreal v) qreal qTan(qreal v)
宏