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
相关产品推荐
相关产品推荐

