C++ &引用;向量迭代器不兼容“;计算两个迭代器之间的距离时
我有一个问题,我不能完全找到原因 在我的代码中的某一点,我返回两个std::vector迭代器之间的距离,一个是对向量执行插入操作的结果,另一个指向向量的开头。其思想是返回新插入对象的索引 当我这样表达代码时,一切都很完美C++ &引用;向量迭代器不兼容“;计算两个迭代器之间的距离时,c++,visual-c++,visual-studio-2013,stl,C++,Visual C++,Visual Studio 2013,Stl,我有一个问题,我不能完全找到原因 在我的代码中的某一点,我返回两个std::vector迭代器之间的距离,一个是对向量执行插入操作的结果,另一个指向向量的开头。其思想是返回新插入对象的索引 当我这样表达代码时,一切都很完美 const_iterator (or auto) it = insert(object); return it - begin(); 然而,如果我试着用它做一行 return insert(object) - begin(); 我得到了前面提到的“向量迭代器不兼容”断言
const_iterator (or auto) it = insert(object);
return it - begin();
然而,如果我试着用它做一行
return insert(object) - begin();
我得到了前面提到的“向量迭代器不兼容”断言
begin()实现为:
MyClass::iterator MyClass::begin()
{
return m_container.begin();
}
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();
}
insert()的实现方式如下:
MyClass::iterator MyClass::begin()
{
return m_container.begin();
}
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::迭代器MyClass::插入(MyObject*object)
{
如果(对象)
{
常量迭代器it=std::下限(begin(),end(),object,DereferencedLess());
if(it==end()| |*(*it)!=*对象)
返回m_容器。插入(它,对象);
}
返回端();
}
课程简介:
MyClass {
...
iterator begin();
const_iterator begin() const;
iterator insert(MyObject*);
...
protected:
std::vector<MyObject*> m_container;
}
MyClass{
...
迭代器begin();
常量迭代器begin()常量;
迭代器插入(MyObject*);
...
受保护的:
std::向量m_容器;
}
为了完整起见
template<typename T>
struct DereferencedLess
{ inline bool operator()(const T *p1, const T *p2) const { return *p1 < *p2; } };
模板
无引用结构
{inline bool operator()(常数T*p1,常数T*p2)常数{return*p1<*p2;};
我很想理解为什么会有这种说法。从我所看到的迭代器是相同类型的,insert()和begin()都在同一个向量上工作。所有必要的typedef也都已准备就绪。
vector::insert
使迭代器无效。在表达式insert(object)中,可以在insert
之前或之后调用-begin()。如果在之前调用,则通过insert()
使其无效:
几乎所有C++操作符的操作数的顺序(包括函数调用表达式中函数参数的顺序和在任何表达式中的子表达式的求值顺序)未指定。编译器可以按任意顺序计算操作数,并且可以在再次计算同一表达式时选择另一个顺序
鉴于当您这样做时:
const_iterator (or auto) it = insert(object);
return it - begin();
begin()
在insert()
之后调用,因此返回一个有效的迭代器。是的,我知道insert()会使迭代器无效(好的,插入对象后面的迭代器),但是如何/为什么可以在insert()之前调用begin()?@azrael为您更新了答案。“@Maxim Egorushkin”谢谢。必须正确检查您提供的链接。