删除向量中的元素第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方法也可以为我们处理该部分,以便我们的代码更易读,更容易理解。
可能有一个很好的理由,我想知道。 有人可以解释或链接解释吗? 感谢。
答案 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
可能相对昂贵。特别是当用户可能已经有一个迭代器时,因为他们发现元素存在于对象中并且他们想要删除它。