#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)
...大家看到了,就算能解决问题,也很不优雅。
不知道大家有没有什么好的解决方案?

解决方案 »

  1.   

    上面调用有问题,不好意思,NULL_VEC和NULL_VEC比较,应该是没有断言的,下面这样肯定会:std::vector<int> v;
    v.push_back...func(v.begin());
      

  2.   

    另外解释一下,虽然是有断言,但代码是逻辑是没有问题的,比如用release版本,或者忽略断言,程序的运行逻辑是正确的。
      

  3.   

    std::vector<int> v;
    v.push_back...func(v.begin());
    func函数传一个v.end()指针,这样可以,不然会出现莫名其妙的错误
    使用容器和迭代器要按照规则,stl本身就是一个规则,按照规则使用,不会有问题
    不按照规则使用,会出现未定义的行为,谁也不能保证未定义行为会产生什么结果
      

  4.   

    程序设计问题...你要用的不是iterator, 而是iterator里面的数据, *it 才是你的函数要处理的内容, 而不是it本身
      

  5.   

    我现在必须要把“未初始化的迭代器”分离出来,因为它是另一种状态。
    如果传*iter或者传&*iter,也有问题,我不得不在fun里面还原出iterator来,这个操作同样不规范(除非通过find去返回一个迭代器,这样就算效率没有影响,情感上也忍受不了)。
    我的fun的意思是,要从iter开始,对vector的每个元素进行处理。
      

  6.   

    我就想知道,stl中,有没有一个函数,可以判断一个迭代器是否已经初始化,如果没有,我再想其它办法。当用未初始化迭代器与已初始化迭代器比较的时候,出了断言,那说明肯定是可以知道未初始化迭代器的,我根据断言的内容,当然也能自己写一个,但这样并不好,如果stl提供了,当然是用stl的,这样以后升级stl就不用担心不兼容等情况。
      

  7.   

    把iterator所属的容器也传进函数, 在函数里面做判断就是了.
    if (it == Container.end())
      return;虽然明白你所说过程, 即在for浏览或者在find之后, 调用这样的一个函数把iterator给函数, 让函数自身来处理相关的逻辑, 包括从容器中删除, 或者查找另外一个容器做某些事情等等. 一般来说, 假如要操作到原来的容器, 那么原来的容器是应该要一并传入然后做相关处理的. 假如不需要操作到原来的容器, 那么应该是在外部检测是否有值以后才调用函数. 这样的代码才符合书写规则的.
      

  8.   

    STL 没有这样的函数,自己实现吧。
      

  9.   

    仅仅是vector的话,
    if(it >= v.begin() && it < v.end())应该就可以了
      

  10.   

    vc9.0下部分代码
    #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事例代码结果。
      

  11.   

    vector的iterator的==操作实际是比较内部指针是否相等,不过之前有些安全性检查。
    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++版问问,那边语言高手多。