I just discovered that at one point, the C++11 draft had std::begin/std::end overloads for std::pair that allowed treating a pair of i
expanding on the above answer using c++11 optimisations:
#include
template
struct range_t : public std::pair {
using pair_t = std::pair;
range_t(pair_t&& src)
: std::pair(std::forward(src))
{}
using std::pair::first;
using std::pair::second;
Iter begin() const { return first; }
Iter end() const { return second; }
};
template
range_t range(std::pair p) {
return range_t(std::move(p));
}
template
range_t range(Iter i1, Iter i2) {
return range_t(std::make_pair(std::move(i1), std::move(i2)));
}
// TEST:
#include
#include
using namespace std;
int main() {
multiset 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;
}