📜  如何使用Erase()和reverse_iterator从向量中擦除元素?(1)

📅  最后修改于: 2023-12-03 14:52:02.966000             🧑  作者: Mango

如何使用Erase()和reverse_iterator从向量中擦除元素?

在使用C++ STL的vector容器时,经常需要对其中的元素进行删除或修改等操作。本文将介绍如何使用Erase()函数和reverse_iterator迭代器来从vector中删除元素。

1. 使用Erase()函数删除元素

vector的Erase()函数用于删除vector中一个或多个元素。其基本语法如下所示:

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

其中,第一个函数用于删除指定位置的元素,第二个函数用于删除[first, last)区间内的所有元素。

具体实现代码如下所示:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v = { 1, 2, 3, 4, 5, 6 };

    // 删除指定位置的元素
    v.erase(v.begin() + 2);

    // 删除区间内的元素
    v.erase(v.begin() + 2, v.begin() + 4);

    // 打印删除后的vector
    for (auto i : v) cout << i << " ";
    cout << endl;

    return 0;
}

上述代码中,v.erase(v.begin() + 2)删除了第3个元素,即数值为3的元素;v.erase(v.begin() + 2, v.begin() + 4)删除了第3个和第4个元素,即数值为3和4的元素。最后,通过for循环遍历删除后的vector,输出结果为:1 2 5 6。

需要注意的是,erase()函数会改变vector的大小和迭代器的有效性,因此需要避免使用已失效的迭代器。此外,删除元素后,后面的元素会向前移动,因此以下代码是错误的:

for (auto it = v.begin(); it != v.end(); it++) {
    if (...) {
        v.erase(it);
    }
}

正确的做法是使用迭代器的后缀形式,如下所示:

for (auto it = v.begin(); it != v.end(); ) {
    if (...) {
        it = v.erase(it);
    } else {
        it++;
    }
}
2. 使用reverse_iterator删除元素

在删除元素时,如果按照从前往后的顺序删除,会使得后面的元素向前移动,从而影响效率。此时,可以使用reverse_iterator(反向迭代器)来从后往前删除元素。

reverse_iterator是一个逆向迭代器,使用方式与普通迭代器相似,但是可以从后往前遍历容器。它有两个重要函数:rbegin()和rend(),用于获取反向迭代器的开始和结束位置。

下面是使用reverse_iterator从vector中删除元素的示例代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v = { 1, 2, 3, 4, 5, 6 };
    auto rit = v.rbegin();

    while (rit != v.rend()) {
        if (...) {
            // 删除该元素
            auto it = rit.base();
            it--;
            v.erase(it);
        }
        rit++;
    }

    // 打印删除后的vector
    for (auto i : v) cout << i << " ";
    cout << endl;

    return 0;
}

上述代码中,使用reverse_iterator(rit)从后往前遍历vector,判断需要删除的元素后,让it指向该元素的正向迭代器,再使用erase()函数删除该元素。

需要注意的是,base()函数可以将reverse_iterator转换为普通迭代器,因此it指向的是被删除元素的后一个元素。最后,通过for循环遍历删除后的vector,输出结果为:1 3 5。

3. 总结

本文介绍了使用Erase()函数和reverse_iterator从vector中删除元素的方法。使用Erase()函数时,需要注意迭代器的有效性和后缀形式。使用reverse_iterator时,可以避免从前往后删除元素时出现的性能问题。