c – 计算两个迭代器之间的距离时,“向量迭代器不兼容”
我遇到了一个我无法找到原因的问题.
在我的代码中的某个点上,我返回两个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:
而当你这样做时: const_iterator (or auto) it = insert(object); return it - begin(); 在insert()之后调用begin(),因此返回一个有效的迭代器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |