我有一个typedef,一个使用该类型的成员向量的类,然后是一个使用std ::< vector> :: erase()的方法。
#typedef DWORD WordNo_t;
class CWordList : public CObject
{
public:
WordNo_t* begin() { return m_Words.begin(); }
WordNo_t* end() { return m_Words.end(); }
void truncate (WordNo_t *Ptr)
{
if (Ptr == end())
return;
ASSERT (Ptr >= begin() && Ptr < end());
// following line generates C2664
m_Words.erase (Ptr, end());
}
private:
std:vector<WordNo_t> m_Words;
}
详细错误是:
错误C2664:'std :: _ Vector_iterator&lt; _Myvec&gt; std :: vector&lt; _Ty&gt; :: erase(std :: _ Vector_const_iterator&lt; _Myvec&gt;,std :: _ Vector_const_iterator&lt; _Myvec&gt;)':无法将参数1从'const WordNo_t'转换为'std :: _ Vector_const_iterator&lt; _Myvec&gt;'
STL很新......任何帮助都会受到赞赏。
答案 0 :(得分:2)
指针不是迭代器。 erase
接受一个迭代器但你传给它一个指针。也许您应该更改truncate
以使用迭代器?
答案 1 :(得分:2)
我很惊讶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());
}