STL矢量擦除通过指针

jac*_*hab 7 c++ iterator stl

理解(至少我认为我这样做)指针可以用作随机STL迭代器.

除非我将指针强制转换为迭代器,否则为什么以下代码无法编译?

vector<int> v{1, 2, 3};
v.erase(&v[0]);
Run Code Online (Sandbox Code Playgroud)

Pau*_*ulR 12

你可以通过指针算法类似std::sort,std::findstd::copy.这些模板可以配置为适当的迭代器.

这并不意味着不同的迭代器必然会相互转换.

该方法erase的的std::vector<int>容器只能与迭代器工作,以相同的矢量的元素.正如已经指出的那样,这可以实现为指针,但通常不是这样,原因如下: C++ std :: vector <> :: iterator不是指针,为什么?

考虑std::find:

template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
Run Code Online (Sandbox Code Playgroud)

InputIt是一个模板参数.该模板std::find将适用于满足输入迭代器要求的任何迭代器类型,并且其operator*返回值可以与类型进行比较T.指针在这里工作得很好.火蓝瑟在评论正确地指出,无论是firstlast类型必须为InputIt.

现在将它与std :: vector :: erase进行比较:

iterator erase( const_iterator pos );
Run Code Online (Sandbox Code Playgroud)

这需要a const_iterator,这是std::vector类的typedef之一.这是一种特殊类型的迭代器,而不是模板参数.