当前位置:   article > 正文

详解Qt中的容器_qt不重复的容器

qt不重复的容器

Qt中的容器类是用于存储和组织数据的重要组件,它们是基于模板类的,可以根据需要存储任意类型的数据。Qt的容器类大致分为两类:顺序容器和关联容器。下面将详细解释各个容器类的用途、差异和使用时的注意事项,并附上代码示例。

1. 顺序容器:

  • QList:动态数组,允许快速的头部和尾部插入,同时也支持随机访问。内部实现不是完全连续的,但如果需要连续内存空间,可以选择QVector。

    示例:

    QList<int> list;
    list.append(1);
    list.append(2);
    list.insert(0, 0); // 在开头插入
    qDebug() << list.at(0); // 通过索引访问元素
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • QVector:类似于STL中的std::vector,提供连续内存存储,对于大数据集,尤其是需要频繁随机访问的场合,QVector可能优于QList。

    示例:

    QVector<QString> vector;
    vector.push_back("Apple");
    vector.insert(0, "Banana");
    qDebug() << vector.data()[1]; // 访问连续内存中的元素
    
    • 1
    • 2
    • 3
    • 4
  • QLinkedList:双向链表,插入和删除操作非常快速,但不支持直接索引访问。

    示例:

    QLinkedList<int> linkedList;
    linkedList.append(10);
    linkedList.prepend(20);
    QLinkedList<int>::iterator it = linkedList.begin();
    ++it; // 移动迭代器
    qDebug() << *it; // 通过迭代器访问元素
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • QStack:后进先出(LIFO)堆栈,只能通过push/pop操作来访问元素。

    示例:

    QStack<int> stack;
    stack.push(3);
    stack.push(4);
    qDebug() << stack.top(); // 返回栈顶元素但不移除
    stack.pop(); // 移除并返回栈顶元素
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • QQueue:先进先出(FIFO)队列,与QStack相反,元素遵循FIFO原则。

    示例:

    QQueue<int> queue;
    queue.enqueue(1);
    queue.enqueue(2);
    qDebug() << queue.dequeue(); // 移除并返回队列首元素
    
    • 1
    • 2
    • 3
    • 4

2. 关联容器

  • QMap<Key, T>:键值对映射容器,支持O(log n)的查找、插入和删除操作,键是唯一的。

    示例:

    QMap<QString, int> map;
    map.insert("apple", 1);
    map.insert("banana", 2);
    int appleCount = map.value("apple", 0); // 获取键为"apple"的值,不存在时返回默认值0
    
    • 1
    • 2
    • 3
    • 4
  • QHash<Key, T>:哈希表实现的键值对容器,查找效率极高,键也是唯一的。

    示例:

    QHash<QString, int> hash;
    hash.insert("apple", 1);
    hash.insert("banana", 2);
    bool containsKey = hash.contains("apple"); // 检查是否存在键为"apple"的项
    
    • 1
    • 2
    • 3
    • 4
  • QSet:集合容器,存储唯一值,不允许重复。

    示例:

    QSet<int> set;
    set.insert(1);
    set.insert(2);
    if (set.contains(1)) { // 检查集合中是否包含某个值
        // ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

注意事项:

  • 隐式共享:Qt容器类采用了隐式共享机制,提高了对象复制的效率。
  • 线程安全性:Qt容器类在多线程环境下,如果仅用于只读操作是线程安全的,但对容器的修改(如插入、删除、移动元素等)需要在适当的锁保护下进行。
  • 内存管理:使用完容器后,确保及时清理或删除不再使用的容器及其中的元素,尤其是在容器中有自定义对象时,避免内存泄漏。
  • 排序和迭代:QList和QLinkedList提供迭代器遍历,QMap和QHash可以通过keys(), values(), and iterators进行遍历。排序容器并未内建,但可以通过sort()函数对QList进行排序。

总之,选择哪种容器取决于你的具体需求,包括数据的访问模式(顺序访问还是随机访问)、元素的插入和删除频率、是否需要保证内存连续性等因素。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/520067
推荐阅读
相关标签
  

闽ICP备14008679号