如何为C++ vector模板添加insert_at()成员函数替代CArray的InsertAt()?
实现vector的insert_at方法的可行方案
由于C++标准不允许直接修改std::vector的类定义(会引发未定义行为),推荐以下几种合规方式实现类似insert_at的调用体验:
1. 自定义vector包装类
最稳妥的方式是封装std::vector,添加所需的insert_at成员函数,完全贴合面向对象语法:
template<typename T, typename Alloc = std::allocator<T>> class VectorWrapper { private: std::vector<T, Alloc> vec; public: // 暴露vector的常用接口 using iterator = typename std::vector<T, Alloc>::iterator; using const_iterator = typename std::vector<T, Alloc>::const_iterator; void push_back(const T& val) { vec.push_back(val); } void push_back(T&& val) { vec.push_back(std::move(val)); } T& operator[](size_t idx) { return vec[idx]; } const T& operator[](size_t idx) const { return vec[idx]; } size_t size() const { return vec.size(); } iterator begin() { return vec.begin(); } const_iterator begin() const { return vec.begin(); } iterator end() { return vec.end(); } const_iterator end() const { return vec.end(); } // 实现insert_at方法 void insert_at(size_t index, const T& value) { vec.insert(vec.begin() + index, value); } void insert_at(size_t index, T&& value) { vec.insert(vec.begin() + index, std::move(value)); } // 批量插入重载(对应CArray的InsertAt) void insert_at(size_t index, const T* pElements, size_t nCount) { vec.insert(vec.begin() + index, pElements, pElements + nCount); } // 按需补充其他CArray兼容接口 };
使用时直接替换原有std::vector为VectorWrapper,调用方式完全符合需求:
VectorWrapper<Point2> array; array.insert_at(0, Point2(10,15)); // 复杂场景下仅需写一次对象 class_instance->element_left.local_coordinate_point_array.insert_at(index, Point2(10,15));
2. 全局模板函数(低改动成本方案)
如果不想封装类,也可以写全局模板函数,大幅简化调用且避免重复输入对象:
template<typename T, typename Alloc = std::allocator<T>> void insert_at(std::vector<T, Alloc>& vec, size_t index, const T& value) { vec.insert(vec.begin() + index, value); } template<typename T, typename Alloc = std::allocator<T>> void insert_at(std::vector<T, Alloc>& vec, size_t index, T&& value) { vec.insert(vec.begin() + index, std::move(value)); }
调用方式:
insert_at(array, index, 10); insert_at(class_instance->element_left.local_coordinate_point_array, index, Point2(10,15));
这种方式无需修改原有vector变量类型,迁移成本更低,只是调用形式为函数而非成员方法,但可读性和维护性远优于直接写迭代器。
注意事项
- 禁止直接给
std::vector添加成员函数,这违反C++标准,会导致未定义行为。 - 对于偏移量为0的场景,两种方案都可直接传入
0作为索引,无需额外处理。 - 包装类可根据原有CArray的接口逐步补充方法(如
RemoveAt、SetSize等),平滑完成迁移。
内容的提问来源于stack exchange,提问作者user1961169
相关产品推荐
相关产品推荐

