How to check if the iterator is initialized?

前端 未结 11 1501
孤城傲影
孤城傲影 2021-02-05 06:30

If I use a default constructor for an iterator, how to check if it was assigned later on?

For pointers, I could do this :

int *p = NULL;
/// some code
         


        
11条回答
  •  轮回少年
    2021-02-05 07:29

    The best way to do this I can think of is something like

    #include 
    #include 
    #include 
    #include 
    
    
    
    namespace nulliterators {
    
    typedef std::map nullcntT;
    nullcntT nullcontainers;
    
    template
    typename containerT::iterator iterator() {
      containerT* newcnt = new containerT();
      std::string cnttypename = typeid(*newcnt).name();
      nullcntT::iterator i = nullcontainers.find(cnttypename);
      if (i==nullcontainers.end()) {
        nullcontainers.insert(make_pair(cnttypename, newcnt));
        return newcnt->end();
       }else{
        delete newcnt;
        return (static_cast(i->second))->end();
      }
    }
    
    }
    template
    typename containerT::iterator nulliterator() { return nulliterators::iterator(); }
    
    
    #include 
    #include 
    
    
    int main(){
    
      std::list::iterator nullinitized = nulliterator< std::list >();
      std::list somelist;
      std::list::iterator initialized = somelist.end();
    
      if (nullinitized == nulliterator< std::list >())
        std::cout << "nullinitized == nulliterator< std::list >()\n";  //true
       else
        std::cout << "nullinitized != nulliterator< std::list >()\n";
    
      if (initialized == nulliterator< std::list >())
        std::cout << "initialized == nulliterator< std::list >()\n";
       else
        std::cout << "initialized != nulliterator< std::list >()\n";  //true
    
      return 0;
    }
    

    but it's not exactly a safe solution (because it relies on the non-const global containers in nullcontainers).

提交回复
热议问题