extending the above answer using C ++ 11 optimization:
#include <utility> template<class Iter> struct range_t : public std::pair<Iter, Iter> { using pair_t = std::pair<Iter, Iter>; range_t(pair_t&& src) : std::pair<Iter, Iter>(std::forward<pair_t>(src)) {} using std::pair<Iter, Iter>::first; using std::pair<Iter, Iter>::second; Iter begin() const { return first; } Iter end() const { return second; } }; template<class Iter> range_t<Iter> range(std::pair<Iter, Iter> p) { return range_t<Iter>(std::move(p)); } template<class Iter> range_t<Iter> range(Iter i1, Iter i2) { return range_t<Iter>(std::make_pair(std::move(i1), std::move(i2))); } // TEST: #include <iostream> #include <set> using namespace std; int main() { multiset<int> mySet { 6,4,5,5,5,3,3,67,8,89,7,5,45,4,3 }; cout << "similar elements: "; for (const auto&i : range(mySet.lower_bound(5), mySet.upper_bound(10))) { cout << i << ","; } cout << "\n"; int count = 0, sum = 0; for (const auto& i: range(mySet.equal_range(5))) { ++count; sum += i; } cout << "5 appears " << count << " times\n" << "the sum is " << sum << "\n"; return 0; }
Richard Hodges Apr 22 '14 at 15:08 2014-04-22 15:08
source share