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.
(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 }make separate function expects ranges
lastincluded: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
Post a Comment