3

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

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

相反,你必须做类似的事情

vec.erase( vec.begin()+1 );

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

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

4

3 回答 3

2

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

于 2012-09-17T20:31:21.090 回答
2

想象一下,如果你有

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

现在,如果您突然更改MyContainer 的底层容器(通过更新typedef),您的语义含义已经完全改变并且仍然可以编译!我想不出任何其他情况,容器类型的如此简单更改会导致如此不同的行为。vectorerase

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

于 2012-09-17T21:12:46.940 回答
1

我能想到的原因有两个:

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

2)erase与标准算法如std::remove, std::remove_if,std::unique等配合良好。更常见的是希望基于某些谓词等擦除元素,而不是硬编码索引号。查找“erase-remove idiom”以获取更多信息。

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

于 2012-09-17T21:23:25.313 回答