C++中能否使用存储数组的vector,该类用法是否合理?
合法性说明
你写的std::vector<int[5]>写法不符合C++标准要求,不具备可移植性:
- C03标准中要求STL容器存储的元素必须是可复制构造、可赋值的类型,原生数组不支持直接复制、直接赋值,因此该写法在C03下完全不合法。
- 即使到了C++11及后续版本,容器对元素的要求放宽到按需满足操作约束,但原生数组仍然不满足可构造、可移动等基础要求,仅部分编译器会通过扩展支持这种用法,换编译环境大概率会编译失败。
该用法少见的核心原因
- 合法性没有标准保障,兼容性差,生产环境不会使用这种依赖编译器扩展的写法。
- 原生数组存入vector后基本操作全部受限:你没法直接调用
push_back、insert、emplace_back这类常规接口添加元素,也没法对vector做整体复制、排序等操作,完全发挥不了vector的优势。
推荐方案
完全不需要自己手动封装数组为类类型,STL已经提供了原生数组的零开销封装std::array,你只要把写法改成:
std::vector<std::array<int, 5>> myvector;
就可以完美实现你预期的访问逻辑myvector[3][4] = 3;,同时完全符合C++标准,兼容所有合规编译器,还支持vector的全部常规操作,性能和原生数组没有任何差异。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

