Я думаю, что статья 2009 года "Пары не дают хороших диапазонов" от Alisdair Meredith - по крайней мере, часть ответа. По сути, многие алгоритмы возвращают пары итераторов, которые на самом деле не гарантируются как допустимые диапазоны. Похоже, по этой причине они убрали поддержку pair<iterator,iterator>
из цикла for-range. Однако предлагаемое решение не было полностью принято.
Если вы точно знаете, что какая-то пара итераторов действительно представляет допустимый диапазон , вы можете заключить их в пользовательский тип, который предлагает функции-члены begin () / end ():
template<class Iter>
struct iter_pair_range : std::pair<Iter,Iter> {
iter_pair_range(std::pair<Iter,Iter> const& x)
: std::pair<Iter,Iter>(x)
{}
Iter begin() const {return this->first;}
Iter end() const {return this->second;}
};
template<class Iter>
inline iter_pair_range<Iter> as_range(std::pair<Iter,Iter> const& x)
{ return iter_pair_range<Iter>(x); }
int main() {
multimap<int,int> mm;
...
for (auto& p : as_range(mm.equal_range(42))) {
...
}
}
(непроверенные)
Я согласен, что это немного бородавка. Функции, которые возвращают допустимые диапазоны (например, equal_range), должны указывать это, используя соответствующий тип возврата. Это немного смущает, что мы должны вручную подтвердить это через что-то вроде as_range
выше.