用YOLOv8 OBB_KPT搞定无人机航拍车辆朝向分析:从X-AnyLabeling标注到模型部署全流程
2026/5/2 15:33:57
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
首先明确核心结论:QVector、QMap 不属于 STL,具体区别如下:
std::vector、std::map是 STL 标准容器,由 C++ 标准规范定义,所有符合标准的编译器(如 GCC、MSVC)都需实现。toStdVector()、fromStdVector()转换),但它们是独立的实现,不属于 STL 范畴。你想明确 std::string 是否归属于 STL、是否属于容器,同时确认 QString 是否算作容器,这是在之前了解 STL/Qt 容器基础上,进一步厘清字符串类的归类问题。
先明确两个层面的定义(避免新手混淆):
std::string是 C++ 标准库的核心类,但并非 STL “六大组件” 中“容器”的正式成员(STL 容器是std::vector/std::map这类通用存储类)。std::开头的标准模板类(包括std::string)都宽泛地称作“STL 类”——这种说法不严谨,但属于行业通用习惯,无需纠结字面定义,重点关注功能差异即可。std::string不是 C++ 标准定义的“容器”,但它是类容器(container-like)类型:
std::vector<T>可存int/string/自定义类型),而std::string是特化的字符存储类(仅用于存储char/wchar_t/char16_t等字符类型),并非通用容器。str[0])、size()/empty()、增删改查(append()/erase())等,日常使用中可以把它当作“专门存字符的特殊容器”。QString 完全不属于容器,原因如下:
QVector/QMap/QList等通用存储类(可存int/QString/自定义类),而 QString 是“数据类型”本身,而非存储其他数据的“容器”——就像int是数值类型、不是容器一样,QString 是字符串类型、也不是容器。at()/[]访问单个字符、length()获取长度,但这只是字符串类的基础功能,不能因此判定为容器(比如std::string也有这些功能,但也不是标准容器)。std::string/QString是“专用存储字符序列的类型”,二者设计目标不同。你希望我系统地总结出 STL 体系下的标准容器、类容器,以及 Qt 框架中的容器和类容器,帮你清晰区分两类体系下的容器相关类型,避免混淆。
这是 STL 六大核心组件之一,是“通用、可存储任意类型元素”的模板类,按特性分为 4 大类:
| 容器类型 | 具体类型 | 核心特点 |
|---|---|---|
| 序列式容器 | std::vector、std::list、std::deque、std::array(C++11)、std::forward_list(C++11) | 按插入顺序存储,元素可重复;vector随机访问快,list插入删除快 |
| 有序关联式容器 | std::map、std::set、std::multimap、std::multiset | 基于红黑树实现,自动排序;map键值对,set无重复元素 |
| 无序关联式容器 | std::unordered_map、std::unordered_set、std::unordered_multimap、std::unordered_multiset(C++11) | 基于哈希表实现,无序;访问速度比有序关联式更快(平均 O(1)) |
| 容器适配器 | std::stack、std::queue、std::priority_queue | 封装基础容器(如vector/deque),提供受限接口(如栈:后进先出) |
这类类型不是 C++ 标准定义的“容器”,但满足容器的核心特征(支持迭代器、随机/顺序访问、size()/empty()、增删改查等),日常开发中常被当作“专用容器”使用:
std::string/std::wstring/std::u8string(std::basic_string特化):仅存储字符序列,字符专用的“类容器”;std::span(C++20):轻量级内存视图,可访问连续内存块(无内存所有权),支持容器式访问;std::valarray:数值专用数组,面向数值计算,支持迭代器和容器式操作,但非通用容器。Qt 没有“类容器”的官方定义,以下按“通用存储容器”和“专用类(具备容器特征)”分类,更贴合实际开发认知:
Qt 自主实现的通用容器,专为 Qt 开发优化(如隐式共享、跨平台、与 Qt 信号槽/元对象兼容),核心类型:
| 容器类型 | 具体类型 | 核心特点 |
|---|---|---|
| 序列式容器 | QVector、QList(Qt 最常用)、QLinkedList、QStack、QQueue | QList是 Qt 首选序列容器(兼顾性能和易用性),QVector对标std::vector |
| 关联式/哈希容器 | QMap、QMultiMap(有序,红黑树)、QHash、QMultiHash(无序,哈希表)、QSet | QHash访问速度比QMap快,QMultiMap支持重复键 |
| 特殊序列容器 | QStringList | 继承QList<QString>,是QString序列的专用容器(本质还是通用容器) |
这类是 Qt 专用数据类型,核心目标不是“存储任意类型”,但支持容器式的元素访问,常被新手误认为容器:
QString:Qt 核心 Unicode 字符串类(UTF-16 编码),支持[]/at()访问单个字符、迭代器遍历,但核心功能是字符串处理(拼接、编码转换、格式化),不是容器;QByteArray:字节序列类,处理二进制数据/8 位字符,支持容器式的增删、访问,但仅存储字节,是“字节专用类”而非通用容器;QBitArray:比特序列类,按位存储数据,支持按位访问/修改,具备容器特征但非通用容器。std::vector/std::map等是标准容器,std::string是类容器(非标准容器);QVector/QMap/QStringList是通用容器,QString/QByteArray是具备容器特征的专用类(非容器)。