📜  矢量删除类 - C++ (1)

📅  最后修改于: 2023-12-03 15:27:17.266000             🧑  作者: Mango

矢量删除类 - C++

本文将介绍一个可以在C++中方便地删除矢量的类。

矢量(vector)是C++ STL(标准模板库)中的一种容器,类似于数组,但具有更高的灵活性和功效,具体可参考cplusplus.com

删除矢量中的元素有不同的方式,例如使用std::vector::erase函数,但有时需要更方便且容易维护的方式。

这里介绍一个矢量删除类,它可以实现以下功能:

  • 将删除操作转换为标记操作,即不做真正的删除,而是将要删除的元素的索引位置打上标记,并在后续的遍历中跳过这些标记位置。
  • 可以一次删除多个元素。
  • 可以恢复之前标记的元素。

下面是类的定义:

template<typename T>
class VectorDelete {
private:
    std::vector<T> m_data;
    std::vector<bool> m_deleted;
public:
    VectorDelete() { }
    ~VectorDelete() { }
    void push_back(const T& elem) {
        m_data.push_back(elem);
        m_deleted.push_back(false);
    }
    void erase(size_t index) {
        m_deleted[index] = true;
    }
    template<typename... Args>
    void erase(size_t index, Args... args) {
        erase(index);
        erase(args...);
    }
    void recover() {
        m_deleted.assign(m_data.size(), false);
    }
    size_t size() const {
        size_t count = 0;
        for (size_t i = 0; i < m_data.size(); ++i) {
            if (!m_deleted[i]) {
                ++count;
            }
        }
        return count;
    }
    T& operator[](size_t index) {
        size_t count = 0;
        for (size_t i = 0; i < m_data.size(); ++i) {
            if (!m_deleted[i] && count == index) {
                return m_data[i];
            }
            else if (!m_deleted[i]) {
                ++count;
            }
        }
        throw std::out_of_range("Invalid index");
    }
};

我们可以看到此类有以下方法:

push_back

用于向矢量尾部添加新元素。

void push_back(const T& elem);
erase

删除给定索引位置的元素,或多个索引位置的元素。

void erase(size_t index);
template<typename... Args>
void erase(size_t index, Args... args);
recover

恢复之前被标记删除的元素。

void recover();
size

返回未被标记删除的矢量元素个数。

size_t size() const;
operator[]

重载运算符[],使得可以按照未被删除的元素索引位置来访问矢量元素。

T& operator[](size_t index);

使用范例:

int main() {
    VectorDelete<int> v;
    for (int i = 1; i <= 10; ++i) {
        v.push_back(i);
    }
    v.erase(2, 5, 8);
    // Now v contains elements 1, 3, 4, 6, 7, 9, 10
    v.recover();
    // Now v contains elements 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    v.erase(1, 4, 7);
    // Now v contains elements 1, 3, 5, 6, 9, 10
    for (size_t i = 0; i < v.size(); ++i) {
        std::cout << v[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}

输出为:

1 3 5 6 9 10

以上就是介绍的矢量删除类,欢迎借鉴使用!