#define NULL_VEC std::vector<int>::iterator()void fun(std::vector<int>::iterator iter /*= NULL_VEC*/)
{
if (NULL_VEC == iter)
{
;
}
else
{
;
}
}void main()
{
fun(NULL_VEC);
}注:以上代码可能要在高版本vc下面编译才能通过,具体多高我也不太清楚,至少vc6不行首先说一下上面代码的问题,就是在debug下,会有断言,release没有。vc10编译(之前的版本,只要能编过,都没有问题,这可能是vc10的新特性)。
我现在就是想解决这个问题,无奈一直没找到好的解决方案,我想大概得这样:
#define NULL_VEC std::vector<int>::iterator()._Ptr
...
if (NULL_VEC == iter._Ptr)
...大家看到了,就算能解决问题,也很不优雅。
不知道大家有没有什么好的解决方案?
v.push_back...func(v.begin());
v.push_back...func(v.begin());
func函数传一个v.end()指针,这样可以,不然会出现莫名其妙的错误
使用容器和迭代器要按照规则,stl本身就是一个规则,按照规则使用,不会有问题
不按照规则使用,会出现未定义的行为,谁也不能保证未定义行为会产生什么结果
如果传*iter或者传&*iter,也有问题,我不得不在fun里面还原出iterator来,这个操作同样不规范(除非通过find去返回一个迭代器,这样就算效率没有影响,情感上也忍受不了)。
我的fun的意思是,要从iter开始,对vector的每个元素进行处理。
if (it == Container.end())
return;虽然明白你所说过程, 即在for浏览或者在find之后, 调用这样的一个函数把iterator给函数, 让函数自身来处理相关的逻辑, 包括从容器中删除, 或者查找另外一个容器做某些事情等等. 一般来说, 假如要操作到原来的容器, 那么原来的容器是应该要一并传入然后做相关处理的. 假如不需要操作到原来的容器, 那么应该是在外部检测是否有值以后才调用函数. 这样的代码才符合书写规则的.
if(it >= v.begin() && it < v.end())应该就可以了
#if _SECURE_SCL && !_HAS_ITERATOR_DEBUGGING
typedef pointer _Checked_iterator_base_type; _Checked_iterator_base_type _Checked_iterator_base() const
{
return _Myptr;
} void _Checked_iterator_assign_from_base(_Checked_iterator_base_type _Base)
{
this->_Myptr = const_cast<_Tptr>(_Base);
}
#endif
迭代器的默认构造函数会把_Myptr置0.
打开_HAS_ITERATOR_DEBUGGING调用_Checked_iterator_base就可以了得到LZ事例代码结果。
debug断言是因为这个吧
#if _HAS_ITERATOR_DEBUGGING
void _Compat(const _Myt& _Right) const
{ // test for compatible iterator pair
if (this->_Mycont == 0 || this->_Mycont != _Right._Mycont)
{
_DEBUG_ERROR("vector iterators incompatible");
_SCL_SECURE_INVALID_ARGUMENT;
}
}
#endif不过我不清楚为什么STLdebug下会打开这个开关,默认要求rhs的父节点不为空而且要和this相等。看看是否能去掉这个宏。如果还不行,建议去C++版问问,那边语言高手多。