原生数组不能直接用=赋值给vector,因vector无对应赋值运算符和构造函数;推荐用迭代器区间构造(如vector vec(begin(arr), end(arr)))或assign;传参后数组退化为指针,需显式传长度。

原生数组不能直接用 = 赋值给 vector
你写 vec = arr 会编译失败,因为 std::vector 没有接受原生数组类型的赋值运算符。C++ 不允许隐式把 int[5] 这类类型转成 std::vector<int></int>,甚至连构造函数都不支持这种语法糖。
最常用:用迭代器区间构造或 assign
推荐在初始化时用迭代器范围构造,或后续用 assign 替换内容:
- 初始化:
std::vector<int> vec(arr, arr + N);</int>(C++11 起可用) - 已有 vector:
vec.assign(arr, arr + N);,会清空再填入 -
N必须是已知常量或运行时确定的长度,不能写arr + sizeof(arr)—— 因为传参后arr退化为指针,sizeof失效
更安全:用 std::begin/std::end 避免长度算错
如果原生数组是局部定义的(未退化),可以用标准算法辅助:
int arr[] = {1, 2, 3, 4, 5};
std::vector<int> vec(std::begin(arr), std::end(arr)); // ✅ 自动推导长度
</int>
但注意:一旦数组作为函数参数传入,std::begin(arr) 就失效了 —— 此时它只是个指针,没有尺寸信息。
别踩坑:data() 和 memcpy 不是“直接赋值”
有人想绕过 vector 管理机制,直接操作底层内存,比如:
-
memcpy(vec.data(), arr, N * sizeof(int));—— 前提是vec.size() >= N,否则越界 -
vec.resize(N);必须先调,否则data()可能为空或长度不足 - 这不算“赋值”,只是内存拷贝;不触发元素构造/析构,对非 POD 类型(如
std::string)会出错
复杂点在于:原生数组生命周期必须长于 vector,且类型兼容性、对齐、异常安全性都得自己兜底。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











