c++ - how to extend range with end() iterator -


(not sure correct task) i'm writing algorithm in stl style related classic sorting. prototype is:

  template<typename raiter>   void algo(raiter first, raiter last) {   ....     size_t size = std::distance(first, last);     raiter miditer =first;     std::advance(miditer, size / 2 - 1);      algo(first, miditer);     algo(miditer + 1, last);     ....  } 

but doesn't work correctly me because , gets range like: vector v; algo(v.begin(), v.end()); , internally, in recursive call subrange doesn't contain end() element.

what typical technique in case?

i'd propose 2 options.

  1. (preferred) make algorithm internally doesn't need inclusion of last. in case can done this:

    template<typename raiter> void algo(raiter first, raiter last) {     ....     size_t size = std::distance(first, last);     if (size <= 1) {          // special processing of single-item or empty range          return;     }      raiter miditer =first;      std::advance(miditer, size / 2);      algo(first, miditer); // miditer not included     algo(miditer, last);  // it's included here instead } 
  2. make separate function expects ranges last included:

    template<typename raiter> void algoimpl(raiter first, raiter last) {     ....     // looks more correct:     // size_t size = std::distance(first, last) + 1;     size_t size = std::distance(first, last);     raiter miditer =first;     std::advance(miditer, size / 2 - 1); // , here "- 1" seems wrong       algoimpl(first, miditer);     algoimpl(miditer + 1, last);     .... }  template<typename raiter> void algo(raiter first, raiter last) {     if (first == last) {         return;     }     algoimpl(first, last - 1); } 

Comments

Popular posts from this blog

How to group boxplot outliers in gnuplot -

cakephp - simple blog with croogo -

bash - Performing variable substitution in a string -