I understand (at least I think I do)指针可以用作随机STL迭代器。
为什么以下代码无法编译,除非我将指针强制转换为迭代器?
vector<int> v{1, 2, 3};
v.erase(&v[0]);
答案 0 :(得分:12)
您可以将指针传递给算法,例如std::sort
,std::find
或std::copy
。这些模板可以配置为适当的迭代器。
这并不意味着不同的迭代器必然会相互转换。
erase
容器的方法std::vector<int>
只能与迭代器一起使用同一向量的元素。正如已经指出的那样,这可以作为指针实现,但由于这里所述的原因通常不是这样:
C++ std::vector<>::iterator is not a pointer, why?
考虑std::find
:
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
此处InputIt
是模板参数。模板std::find
将适用于满足input iterator要求的任何迭代器类型,其operator*
返回可与类型T
进行比较的内容。指针在这里工作得很好。正如Fire Lancer在评论中正确指出的那样,first
和last
都必须属于InputIt
类型。
现在将其与std::vector::erase进行比较:
iterator erase( const_iterator pos );
这需要const_iterator
,这是std::vector
类的typedef之一。这是一种特殊类型的迭代器,而不是模板参数。
答案 1 :(得分:1)
ab
的定义是
vector.erase(...)
iterator erase( const_iterator pos );
本身就是一个类。
因此,如果有一个普通指针转换为此类,那么这可以完成。但我认为没有。
但有一点是在预期使用迭代器的地方使用它,而另一种是在算法中使用它。
如果需要const iterator
,则只能使用迭代器。
在算法中,不期望iterator
。只有满足Concept iterator {{3}}的对象(通常是iterator
和begin
才能返回所需的迭代器/指针。
答案 2 :(得分:0)
虽然指针是迭代器,但它们与 vector 迭代器不同的类型(至少它们不一定是这样)。
您可以使用迭代器和指针算法将指向vector元素的指针转换为迭代器。
std::vector<int> v{1, 2, 3};
int* p = &v[0]; // a pointer
auto v_iter = v.begin() + std::distance(v.data(), p); // an equivalent vector::iterator
v.erase(v_iter);
这仅适用于std::vector
或std::array
等连续容器。