📅  最后修改于: 2023-12-03 15:27:17.266000             🧑  作者: Mango
本文将介绍一个可以在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");
}
};
我们可以看到此类有以下方法:
用于向矢量尾部添加新元素。
void push_back(const T& elem);
删除给定索引位置的元素,或多个索引位置的元素。
void erase(size_t index);
template<typename... Args>
void erase(size_t index, Args... args);
恢复之前被标记删除的元素。
void recover();
返回未被标记删除的矢量元素个数。
size_t size() const;
重载运算符[],使得可以按照未被删除的元素索引位置来访问矢量元素。
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
以上就是介绍的矢量删除类,欢迎借鉴使用!