Я удивлен, begin
и end
даже компилируются, они не должны. std::vector
(и друзья) используют итераторы, а не указатели. (Хотя они должны действовать аналогично.)
В любом случае, erase
принимает итератор, а не указатель. Поскольку векторы являются смежными, вы можете создавать служебные функции как таковые:
template <typename T, typename A>
typename std::vector<T, A>::iterator
to_iterator(T* pPtr, std::vector<T, A>& pVec)
{
ASSERT(pPtr >= &pVec.front() && pPtr <= &pVec.back());
return pVec.begin() + (pPtr- &pVec[0]);
}
template <typename T, typename A>
typename std::vector<T, A>::const_iterator
to_iterator(const T* pPtr, const std::vector<T, A>& pVec)
{
ASSERT(pPtr >= &pVec.front() && pPtr <= &pVec.back());
return pVec.begin() + (pPtr - &pVec[0]);
}
По сути, выясните, сколько элементов pPtr
из &pVec[0]
(первый элемент), затем добавьте это к pVec.begin()
. (Преобразуйте смещение от указателя и указателя для начала в смещение от начала.) Эта операция O (1). А потом:
void truncate (WordNo_t *Ptr)
{
// note the == end() bit will be in here anyway:
m_Words.erase(to_iterator(Ptr, m_Words), end());
}