You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中不使用标准库函数如何删除vector内指定索引的string元素

实现方案

方案1:原地元素移动+缩容(空间复杂度O(1))

核心逻辑是手动移动待删除索引之后的所有元素向前覆盖,最后截断容器末尾的冗余位置,不需要调用erase/remove。
操作步骤:

  • 首先校验输入索引的合法性:索引必须满足 idx >= 0 && idx < vec.size(),非法索引直接终止操作
  • 从待删除索引的下一个位置开始遍历,将每个元素赋值给前一个位置的元素,覆盖掉待删除的内容
  • 调用resize方法将容器长度减1,丢弃最后多余的重复元素

代码示例:

#include <vector>
#include <string>

void delete_element_by_idx(std::vector<std::string>& vec, size_t idx) {
    // 索引合法性校验
    if (idx >= vec.size()) {
        return;
    }
    // 后续元素向前覆盖,用std::move减少string拷贝开销,也可以直接普通赋值
    for (size_t i = idx; i < vec.size() - 1; ++i) {
        vec[i] = std::move(vec[i+1]);
    }
    // 截断末尾冗余元素
    vec.resize(vec.size() - 1);
}

注意:如果也禁止使用resize,可以额外维护一个独立变量记录容器的实际有效长度,业务访问容器时只访问前N个有效元素即可。

方案2:新容器拷贝过滤(空间复杂度O(n))

如果不允许修改原容器、或者原地操作的限制更多,可以遍历原容器,跳过待删除索引的元素,把其余元素全部拷贝到新的vector中,最后用新容器替换原容器即可。
代码示例:

#include <vector>
#include <string>

std::vector<std::string> delete_element_by_idx(const std::vector<std::string>& vec, size_t idx) {
    std::vector<std::string> new_vec;
    new_vec.reserve(vec.size() - 1); // 预分配空间优化性能
    for (size_t i = 0; i < vec.size(); ++i) {
        if (i != idx) {
            new_vec.push_back(vec[i]);
        }
    }
    return new_vec;
}

该方案不需要对原容器做任何修改操作,兼容性更强,也避免了原地移动元素可能带来的额外问题。

内容的提问来源于stack exchange,提问作者tuturalpha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:36:02