STL矢量擦除通过指针

时间:2017-09-11 11:43:15

标签: c++ stl iterator

I understand (at least I think I do)指针可以用作随机STL迭代器。

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

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

3 个答案:

答案 0 :(得分:12)

您可以将指针传递给算法,例如std::sortstd::findstd::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在评论中正确指出的那样,firstlast都必须属于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}}的对象(通常是iteratorbegin才能返回所需的迭代器/指针。

答案 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::vectorstd::array等连续容器。