std::vector::erase
将接受表示要擦除的元素位置的单个迭代器,或者表示范围的两个迭代器。但你不能这样做:
std::vector<int> vec = { 1, 2, 3 };
vec.erase(1);
相反,你必须做类似
的事情vec.erase( vec.begin()+1 );
这似乎是不必要的额外工作 - 只是想知道,是否有一些原因来自POV的类设计为什么不包含这种重载?
编辑:选择最全面的答案,一切都很好。同样在我写这篇文章的时候,这篇文章因为“没有建设性”而获得4票赞成票;但是,鉴于答案的质量,我认为这显然是一个有用的问题,当然对我而言。
答案 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::remove
,std::remove_if
,std::unique
等标准算法。想要根据某些内容擦除元素更为常见谓词等,而不是硬编码索引号。查看“擦除删除习语”以获取更多信息。
基本上,由于许多原因,迭代器被认为优于索引,并且您将在C ++标准库中广泛使用它。如果有意义的话,指数是为模拟阵列访问提供的。