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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:45:57