为什么std :: vector :: erase重载不能取整数索引?

时间:2012-09-17 20:20:52

标签: c++ stl stdvector

std::vector::erase将接受表示要擦除的元素位置的单个迭代器,或者表示范围的两个迭代器。但你不能这样做:

std::vector<int> vec = { 1, 2, 3 };
vec.erase(1);

相反,你必须做类似

的事情
vec.erase( vec.begin()+1 );

这似乎是不必要的额外工作 - 只是想知道,是否有一些原因来自POV的类设计为什么不包含这种重载?

编辑:选择最全面的答案,一切都很好。同样在我写这篇文章的时候,这篇文章因为“没有建设性”而获得4票赞成票;但是,鉴于答案的质量,我认为这显然是一个有用的问题,当然对我而言。

3 个答案:

答案 0 :(得分:2)

我的理解是stl想要分隔indeces和整数,因为它们不是同一个东西(sementically):如果你想做算术使用整数,如果你想访问stl容器中的元素使用迭代器。它也提供抽象:通常整数可以作为索引,有时它没有意义。

答案 1 :(得分:2)

想象一下,如果你有

typedef std::set<int> MyContainer
MyContainer c;
// ...
c.erase(5);  // Or a programmatic int

现在,如果您将MyContainer的基础容器(通过更新typedef)更改为vector,您的erase语义意义已完全改变并仍在编译中!我想不出任何其他情况,容器类型的这种简单改变会导致这种不同的行为。

为避免这种情况,erase只有值或迭代器输入,从不索引。

答案 2 :(得分:1)

我能想到两个原因:

1)erase是容器的通用成员函数。使用索引仅对某些容器有意义,因此通过使用迭代器,您不必担心正在处理的容器类型。例如,索引仅对随机访问容器有意义,通过使用迭代器使代码更灵活等等。

2)erase适用于std::removestd::remove_ifstd::unique等标准算法。想要根据某些内容擦除元素更为常见谓词等,而不是硬编码索引号。查看“擦除删除习语”以获取更多信息。

基本上,由于许多原因,迭代器被认为优于索引,并且您将在C ++标准库中广泛使用它。如果有意义的话,指数是为模拟阵列访问提供的。