Заголовок <algorithm>
предоставляет std::equal_range()
, а также некоторые контейнеры, имеющие его в качестве функции-члена. Что меня беспокоит в этой функции, так это то, что она возвращает пару итераторов, что делает утомительным итерацию от начального итератора к конечному итератору. Я хотел бы иметь возможность использовать std::begin()
и std::end()
, чтобы я мог использовать цикл for на основе диапазона С++ 11.
Теперь я слышал противоречивую информацию относительно специализации std::begin()
и std::end()
- мне сказали, что добавление чего-либо в пространство имен std приводит к неопределенному поведению, тогда как мне также сказали, что вы можете предоставить свои собственные специализации std::begin()
и std::end()
.
Вот что я делаю прямо сейчас:
namespace std
{
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter begin(pair<Iter, Iter> const &p)
{
return p.first;
}
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter end(pair<Iter, Iter> const &p)
{
return p.second;
}
}
И это работает: http://ideone.com/wHVfkh
Но мне интересно, какие минусы в этом? Есть лучший способ сделать это?