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

时间:2015-03-30 17:27:10

标签: c++

删除向量中的元素第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的成员,因此erase方法也可以为我们处理该部分,以便我们的代码更易读,更容易理解。

可能有一个很好的理由,我想知道。 有人可以解释或链接解释吗? 感谢。

3 个答案:

答案 0 :(得分:2)

如果您希望能够做到这一点,那么很容易想出一个功能模板(或者它是一个模板功能吗?),这样做会略有不同,但语法可能相似:

#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;
}

答案 1 :(得分:0)

由于vector.erase接收迭代器,但不是整数。 您可以在文档http://www.cplusplus.com/reference/vector/vector/erase/

上看到这一点 我认为,STL开发人员希望在所有容器泛型类(向量,列表等)上创建唯一的擦除接口

答案 2 :(得分:0)

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

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