[英]“Vector Iterators Incompatible” when calculating distance between two iterators
我遇到了一个我无法找到原因的问题。
在我的代码中的某个点上,我返回两个std :: vector迭代器之间的距离,一个是对向量的插入操作的结果,另一个是向量的开头。 想法是返回新插入对象的索引。
当我说出这样的代码时,一切都很完美
const_iterator (or auto) it = insert(object);
return it - begin();
但是,如果我尝试制作一个衬里
return insert(object) - begin();
我得到前面提到的“矢量迭代器不兼容”断言。
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()都在同一个向量上工作。 所有必要的typedef也都存在。
vector::insert
使迭代器无效。 在表达式insert(object) - begin()
begin()
可以在insert
之前或之后调用begin()
。 如果之前调用它,则由insert()
使其无效。 评估顺序 :
几乎所有C ++运算符的操作数的评估顺序(包括函数调用表达式中函数参数的评估顺序以及任何表达式中子表达式的评估顺序)都未指定。 编译器可以按任何顺序计算操作数,并且可以在再次计算相同表达式时选择另一个顺序。
而当你这样做时:
const_iterator (or auto) it = insert(object);
return it - begin();
在insert()
之后调用begin()
,因此返回一个有效的迭代器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.