原生c++数组无法真正删除首元素,只能逻辑偏移;std::vector::erase(v.begin())可删除但o(n);频繁首删应选std::deque::pop_front()(o(1));std::array不支持删除。

std::vector 用 erase 删除首元素最直接
原生 C++ 数组(比如 int arr[10])不能在头部删元素——它内存固定,删了第一个,后面元素不会自动前移,你得手动搬数据,还必须自己维护“有效长度”。真要动态删,得换 std::vector。
std::vector 的 erase 是标准做法:
std::vector<int> v = {1, 2, 3, 4};
v.erase(v.begin()); // 删除第一个,v 变成 {2, 3, 4}</int>
注意:v.begin() 返回的是迭代器,不是下标;别写成 v.erase(0),那会编译失败。
用 std::deque 避免头部删除的性能开销
std::vector::erase 删首元素是 O(n):后面所有元素都要往前拷贝一位。如果频繁在开头删,性能会明显变差。
这时改用 std::deque 更合适,它的 pop_front() 是 O(1):
std::deque<int> dq = {1, 2, 3, 4};
dq.pop_front(); // 删除 1,dq 变成 {2, 3, 4}</int>
-
deque支持随机访问(dq[2]合法),但迭代器失效规则比vector复杂 - 内存不连续,缓存局部性略差;小数据量差异不明显
- 别对
deque调用erase(dq.begin()),虽然能用,但语义不如pop_front()清晰
原生数组真要“模拟”删首元素,只能靠偏移+长度管理
如果你被限制必须用原生数组(比如嵌入式、性能极致场景),那就不能真删,只能逻辑上“跳过”第一个:
- 维护一个起始偏移
start_idx和当前有效长度size - 每次“删首元素”,只做
++start_idx; --size; - 访问第 i 个有效元素时,实际读
arr[start_idx + i] - 注意检查
start_idx + i ,否则越界
这种做法零拷贝,但所有访问逻辑都得绕一层,出错概率高,且无法释放原始内存空间。
别踩 std::array 的坑:它也不能删元素
std::array<int></int> 是封装好的原生数组,大小编译期固定。它没有 erase、没有 pop_front,调用 clear() 也只是把每个元素调用析构函数(对 int 无效果),长度不变。
试图这样写会编译失败:
std::array<int> a = {1,2,3,4};
a.erase(a.begin()); // ❌ error: no member named 'erase'</int>
想用类似数组的接口又需要增删,就老实用 vector 或 deque,别硬套 array。
真正麻烦的从来不是“怎么删”,而是删完之后,谁来保证后续所有访问都意识到首元素已经不存在了——这个责任,原生数组根本不承担。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











