为什么在删除元素时需要vector.begin()

Why is vector.begin() needed when deleting an element?

本文关键字:vector begin 删除 元素 为什么      更新时间:2023-10-16

删除矢量中的第4个元素需要以下代码:

vector<int> v;
....
....
v.erase(v.begin()+3); // Erase v[3], i.e. the 4th element

我想知道为什么我们需要v.begin()部分。最好写下:

v.erase(3); // Erase v[3], i.e. the 4th element

begin()是vector的一个成员,所以擦除方法也可以为我们处理这部分,这样我们的代码就会更可读、更容易理解。

可能有一个很好的理由,我想知道。有人能解释或联系解释吗?谢谢

如果这是你想做的事情,那么很容易想出一个函数模板(或者它是一个模板函数吗?),它将使用稍微不同但可能足够相似的语法来实现这一点:

#include <iostream>
#include <ostream>
#include <vector>
template <typename T>
void erase_at( T& container, size_t pos)
{
    container.erase(container.begin() + pos);
}

using namespace std;
int main() {
    vector<int> v;
    v.push_back(0);
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    for (vector<int>::iterator i = v.begin(); i != v.end(); ++i) {
        cout << *i << " ";
    }
    cout  << endl;
    erase_at(v, 3);  // <-- instead of `v.erase(v.begin() + 3)`
    for (vector<int>::iterator i = v.begin(); i != v.end(); ++i) {
        cout << *i << " ";
    }
    cout  << endl;
    return 0;
}

据推测,这里的关键之一是创建一个到标准库容器的统一接口。

让我们来看一下std::set<T>std::vector<T>std::list<T>。只有在其中一种情况下,我们才能访问随机访问迭代器。在所有其他情况下,获得container.begin() + 3可能相对昂贵。特别是当用户可能已经有了迭代器时,因为他们发现对象中存在元素,并希望将其删除。

因为vector.erase接收迭代器,但不接收整数。您可以在文档中看到http://www.cplusplus.com/reference/vector/vector/erase/

STL开发人员,我认为,想要在所有容器泛型类(向量、列表等)上创建唯一的擦除接口