当前位置 : 主页 > 编程语言 > c++ >

c – 计算两个迭代器之间的距离时,“向量迭代器不兼容”

来源:互联网 收集:自由互联 发布时间:2021-06-23
我遇到了一个我无法找到原因的问题. 在我的代码中的某个点上,我返回两个std :: vector迭代器之间的距离,一个是对向量的插入操作的结果,另一个是向量的开头.想法是返回新插入对象的索
我遇到了一个我无法找到原因的问题.

在我的代码中的某个点上,我返回两个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()可以在insert之前或之后调用begin().如果之前调用它,则由insert()使其无效. Order of evaluation:

Order of evaluation of the operands of almost all C++ operators (including the order of evaluation of function arguments in a function-call expression and the order of evaluation of the subexpressions within any expression) is unspecified. The compiler can evaluate operands in any order, and may choose another order when the same expression is evaluated again.

而当你这样做时:

const_iterator (or auto) it = insert(object);
return it - begin();

在insert()之后调用begin(),因此返回一个有效的迭代器.

网友评论