有序数组删除元素应使用std::vector配合lower_bound和erase实现高效操作。首先通过std::lower_bound以O(log n)时间找到目标位置,再用erase删除,避免线性查找开销;若存在重复元素,可结合std::equal_range获取全部匹配范围后一次性删除,既保持有序性又提升效率。

在C++中,有序数组删除元素需要保持数组的有序性。由于数组大小固定,通常使用std::vector配合算法函数来实现动态删除。以下是几种常用且高效的方法。
使用 std::vector 和 erase 配合 find
如果知道要删除的值,可以用std::find 找到该元素位置,再用 erase 删除。
示例代码:
立即学习“C++免费学习笔记(深入)”;
#include#include
#include iostream>
int main() {
std::vector
int val = 5;
auto it = std::find(arr.begin(), arr.end(), val);
if (it != arr.end()) {
arr.erase(it);
std::cout } else {
std::cout }
for (int x : arr) std::cout return 0;
}
利用有序特性使用二分查找(更高效)
因为数组有序,用std::lower_bound 可以以 O(log n) 时间定位元素,比 std::find 的 O(n) 更快。
说明: lower_bound 返回第一个不小于目标值的位置。若该位置等于目标值,则说明存在。
示例代码:
立即学习“C++免费学习笔记(深入)”;
auto it = std::lower_bound(arr.begin(), arr.end(), val);if (it != arr.end() && *it == val) {
arr.erase(it);
}
删除多个相同元素
若有序数组中可能有重复元素,需删除所有匹配项,可使用equal_range 获取范围后一次性删除。
示例:
auto range = std::equal_range(arr.begin(), arr.end(), val);arr.erase(range.first, range.second);
这种方法适用于有序数据,效率高且代码简洁。
基本上就这些。用 vector + lower_bound + erase 是处理有序数组删除的标准做法,既保持顺序又避免遍历开销。











