C++ 如何将vector操作函数改写为适配array类模板的通用版本
适配任意长度std::array的通用函数实现
你不需要为每一种固定长度的array单独编写函数,只需要利用C++的非类型模板参数编写模板函数即可,编译器会自动为不同长度的array实例生成对应的函数版本,使用体验和适配任意长度vector的函数一致。
示例实现代码如下:
#include <array> #include <iostream> using namespace std; // 输出任意长度的int型array内容 template<size_t N> // N为非类型模板参数,代表array的长度,编译期自动推导 void outputArray(const array<int, N>& arr) { for (int item : arr) cout << item << " "; cout << endl; } // 为任意长度的int型array输入内容 template<size_t N> void inputArray(array<int, N>& arr) { for (int& item : arr) cin >> item; }
使用方式和vector版本的函数完全一致:
int main() { array<int, 7> arr7; array<int, 10> arr10; // 自动适配不同长度的array inputArray(arr7); inputArray(arr10); outputArray(arr7); outputArray(arr10); return 0; }
std::array 相比 std::vector 的核心使用价值
std::array的长度固定是编译期约束,它相比vector的优势主要体现在以下几点:
- 无动态内存开销:std::array的元素存储在栈内存(作为局部变量时),不需要像vector一样在堆上申请动态内存,分配和释放的速度更快,也不会产生堆内存碎片,适合存储长度固定、规模较小的序列。
- 性能更高:因为长度编译期固定,没有vector动态扩容的额外开销,编译器可以做更多的优化(比如循环展开),运行时性能更稳定。
- 语义更清晰:声明
std::array<int, 7>就明确表示该序列长度固定为7,不会在运行时发生变化,方便后续代码维护,也能在编译期提前发现长度不匹配的错误。 - 内存布局更轻量:std::array的内存布局和原生C数组完全一致,除了存储元素本身没有额外的管理字段(vector需要额外存储起始指针、长度、容量三个字段),和C语言旧代码交互时也更方便,直接调用
data()方法即可获得原生数组指针。
内容的提问来源于stack exchange,提问作者Bazoya
相关产品推荐
相关产品推荐

