我遇到了一个问题,但是我无法找出其原因。
在我的代码中的某个特定点,我返回两个std::vector迭代器之间的距离,其中一个是插入操作在向量上的结果,另一个则指向向量的开头。我的想法是返回新插入对象的索引。
当我将代码表述为如下形式时,一切都完美运行:
const_iterator (or auto) it = insert(object);
return it - begin();
然而,如果我试图将其简洁地表达成一行
return insert(object) - begin();
我收到了"Vector Iterators Incompatible"的断言信息。
begin() 的实现如下:
MyClass::iterator MyClass::begin()
{
return m_container.begin();
}
insert()的实现方式如下:
MyClass::iterator MyClass::insert(MyObject *object)
{
if (object)
{
const_iterator it = std::lower_bound(begin(), end(), object, DereferencedLess<MyObject >());
if (it == end() || *(*it) != *object)
return m_container.insert(it, object);
}
return end();
}
课程简介:
MyClass {
...
iterator begin();
const_iterator begin() const;
iterator insert(MyObject*);
...
protected:
std::vector<MyObject*> m_container;
}
为了完备起见
template<typename T>
struct DereferencedLess
{ inline bool operator()(const T *p1, const T *p2) const { return *p1 < *p2; } };
我非常希望能够理解为什么会出现这个断言错误。据我所见,迭代器类型相同,insert()和begin()方法也在同一个vector上工作。所有必要的typedefs也已经正确声明。