标<algorithm>
头提供std::equal_range()
,以及一些将其作为成员函数的容器。这个函数困扰我的是它返回一对迭代器,使得从开始迭代器迭代到结束迭代器变得乏味。我希望能够使用std::begin()
,std::end()
这样我就可以使用基于 C++11 范围的 for 循环。
现在,我听说了关于专业化std::begin()
和的矛盾信息std::end()
- 我被告知将任何内容添加到 std 命名空间会导致未定义的行为,而我也被告知您可以提供自己的专业化std::begin()
and 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
但我想知道,这样做有什么缺点?有一个更好的方法吗?