<algorithm>
標頭提供了std::equal_range()
,以及一些容器將其作爲成員函數。這個函數困擾我的是它返回了一對迭代器,使得從開始迭代器迭代到結束迭代器變得繁瑣。我希望能夠使用std::begin()
和std::end()
,以便我可以使用C++ 11基於範圍的for-loop。現在我可以專注於std :: begin和std :: end以獲得equal_range()的返回值嗎?
,我聽到關於矛盾的信息,以專業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
但我想知道,有什麼缺點來這樣做呢?有一個更好的方法嗎?
究竟是如何'挑剔'是關於它允許的部分,如果涉及用戶定義的類型?該對包含迭代器,它遍歷unique_ptrs的容器到我的用戶定義類型。 –
您所寫的定義中沒有提及任何用戶定義的類型。這些模板最終可能會用用戶定義的類型實例化,但這不相關。 –
在任何情況下,「取決於用戶定義的類型」轉義孵化只適用於模板專業化。你的不是:它們是主要的函數模板,它恰好會重載具有相同名稱的其他函數模板。 –