为什么在删除元素时需要vector.begin()
Why is vector.begin() needed when deleting an element?
删除矢量中的第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的一个成员,所以擦除方法也可以为我们处理这部分,这样我们的代码就会更可读、更容易理解。
可能有一个很好的理由,我想知道。有人能解释或联系解释吗?谢谢
如果这是你想做的事情,那么很容易想出一个函数模板(或者它是一个模板函数吗?),它将使用稍微不同但可能足够相似的语法来实现这一点:
#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;
}
据推测,这里的关键之一是创建一个到标准库容器的统一接口。
让我们来看一下std::set<T>
、std::vector<T>
和std::list<T>
。只有在其中一种情况下,我们才能访问随机访问迭代器。在所有其他情况下,获得container.begin() + 3
可能相对昂贵。特别是当用户可能已经有了迭代器时,因为他们发现对象中存在元素,并希望将其删除。
因为vector.erase接收迭代器,但不接收整数。您可以在文档中看到http://www.cplusplus.com/reference/vector/vector/erase/
STL开发人员,我认为,想要在所有容器泛型类(向量、列表等)上创建唯一的擦除接口
相关文章:
- 如何使用vector.begin()和vector.end()遍历矩阵?
- 递减 std::vector::begin 是否未定义,即使它从未被使用过?
- 迭代器返回 vector::begin()
- "lvalue required as increment operand" 关于 C++ 和 stl vector's begin()
- 为什么在 std::vector 擦除中需要 begin()
- C++ vector.begin() and vector[0]
- 通过 vector.begin() 命令访问 vector 的第一个元素
- C++:为什么在 #include 之前调用 std::wstring::begin() 会导致<vector>此代码中的编译器错误?
- std::vector::front() 和 begin() 之间的区别
- 为什么在删除元素时需要vector.begin()
- 来自prioric++11的std::vector::begin()是否等效于C++11中的std::vector::d
- Empty std::vector begin != end
- 如何为std::vector设置有效的.begin()和.end()而不使用.resize()
- 如何使用 vector.begin() 将向量的向量打印到 vector.end()
- 如果我使用 vector::begin() 而不是 std::back_inserter(vector) 来输出set_
- Is std::vector::begin() - 1 undefined?
- vector::begin()和std::begin()之间的差异
- 为什么编译器在C++中允许vector.begin()=vector.end()
- Auto it = vector.begin()结果类型不能转换为const_iterator
- 模板方法的实例和 std::vector.begin() 作为参数的问题