gpt4 book ai didi

c++ - "Vector Iterators Incompatible"计算两个迭代器之间的距离时

转载 作者:太空狗 更新时间:2023-10-29 20:20:15 28 4
gpt4 key购买 nike

我遇到了一个我无法完全找到原因的问题。

在我的代码中的某个点,我返回了两个 std::vector 迭代器之间的距离,一个是对 vector 的插入操作的结果,另一个指向 vector 的开头。思路是返回新插入对象的索引。

当我这样表述代码时,一切都完美无缺

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

但是,如果我尝试用它制作一个衬垫

return insert(object) - begin();

我得到前面提到的“vector 迭代器不兼容”断言。

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();
}

类(class)大纲:

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 上工作。所有必要的 typedef 也已准备就绪。

最佳答案

vector::insert 使迭代器无效。在表达式中 insert(object) - begin() begin() 可以在 insert 之前或之后调用。如果它之前被调用过,它会被 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();

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

关于c++ - "Vector Iterators Incompatible"计算两个迭代器之间的距离时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52405053/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com