谦和的手电筒 · 江苏省体育局 政务信息 ...· 6 月前 · |
失眠的烤地瓜 · 傲娇奶爸休想逃 ...· 1 年前 · |
俊逸的卡布奇诺 · 手机0电关机也能开门—华为智选VOC智能门锁 ...· 1 年前 · |
骑白马的红茶 · 第14话-专线玩家-漫画牛· 1 年前 · |
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模板提供了一个列表,实际上是一个指针数组,当项目数小于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继承自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
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)
单链表
//返回vector底层数组指针。只要不重新分配vector对象,指针就保持有效。 这个函数在将vector传递给接受普通c++数组的函数时非常有用。
T *data()
const T *data() const
//将value赋给向量中的所有项。 如果size不同于-1(默认值),则vector的大小将被调整为size之前的大小。
QVector<T> &fill(const T &value, int size = -1)
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<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
插入和替换:插入新的键值对。
如果已经有一个键为key的项,则该项的值将被value替换。
如果有多个键为key的项,则最近插入的项的值将被value替换。
typename QMap<Key, T>::iterator replace(const Key &key, const T &value)
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
继承自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::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
直接使用STL中的算法
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()
骑白马的红茶 · 第14话-专线玩家-漫画牛 1 年前 |