加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:21:48 所属栏目:百科 来源:网络整理
导读:我遇到了一个我无法找到原因的问题. 在我的代码中的某个点上,我返回两个std :: vector迭代器之间的距离,一个是对向量的插入操作的结果,另一个是向量的开头.想法是返回新插入对象的索引. 当我说出这样的代码时,一切都很完美 const_iterator (or auto) it = in
我遇到了一个我无法找到原因的问题.

在我的代码中的某个点上,我返回两个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(),因此返回一个有效的迭代器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读